python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python os模块操作文件与目录

Python使用os模块操作文件与目录的完整指南

作者:AI手记叨叨

os 模块是Python标准库的一部分,无需额外安装即可使用,它封装了不同操作系统的底层系统调用,它可以让我们在Python中执行各种操作系统级别的任务,所以本文给大家介绍了Python使用os模块操作文件与目录的完整指南,需要的朋友可以参考下

一、os 模块是什么

os 模块是Python标准库的一部分,无需额外安装即可使用。它封装了不同操作系统(Windows、Linux、MacOS等)的底层系统调用,提供了一致的接口使用,它可以让我们在Python中执行各种操作系统级别的任务,如创建/删除目录、遍历文件系统、管理文件路径等。

二、路径操作

1. 获取当前工作目录

需求场景:

os.getcwd() 返回的是字符串形式的绝对路径。

import os

current_dir = os.getcwd()
print(f"当前工作目录: {current_dir}")

2. 改变工作目录

需求场景:

os.chdir() 会改变当前进程的工作目录。如果目标目录不存在会抛出 FileNotFoundError

os.chdir('/path/to/new/directory')
print(f"新工作目录: {os.getcwd()}")

3. 路径拼接

需求场景:

使用 os.path.join() 可以安全地拼接路径,它会自动处理不同操作系统的路径分隔符。

path = os.path.join('folder', 'subfolder', 'file.txt')
print(f"拼接后的路径: {path}")
# 在Windows上输出: folder\subfolder\file.txt
# 在Linux/Mac上输出: folder/subfolder/file.txt

4. 路径分解与提取

需求场景:

os.path.dirname()os.path.basename() 是互补的操作。os.path.splitext()只会分离最后一个扩展名,对于多重扩展名(如".tar.gz")需要特别注意。

file_path = "/home/user/documents/report.txt"

# 获取路径的目录部分
dir_name = os.path.dirname(file_path)
print(f"目录部分: {dir_name}")  # /home/user/documents

# 获取文件名部分
base_name = os.path.basename(file_path)
print(f"文件名部分: {base_name}")  # report.txt

# 分割文件扩展名
name, ext = os.path.splitext(base_name)
print(f"文件名: {name}, 扩展名: {ext}")  # 文件名: report, 扩展名: .txt

5. 路径有效性检查

需求场景:

这些检查函数不会抛出异常,而是返回布尔值。对于符号链接,os.path.isfile()os.path.isdir()会跟随链接检查目标文件/目录。

path = "/some/path/to/file.txt"

print(f"路径是否存在: {os.path.exists(path)}")
print(f"是否是文件: {os.path.isfile(path)}")
print(f"是否是目录: {os.path.isdir(path)}")
print(f"是否是绝对路径: {os.path.isabs(path)}")

三、目录操作

1. 创建目录

需求场景:

os.mkdir() 只能创建单级目录,如果父目录不存在会抛出 FileNotFoundError。而 os.makedirs()可以递归创建多级目录,exist_ok=True 参数使得目录已存在时不会报错。

# 创建单个目录
os.mkdir('new_directory')

# 创建多级目录
os.makedirs('parent/child/grandchild', exist_ok=True)  # exist_ok=True 避免目录已存在时报错

2. 删除目录

需求场景:

os.rmdir()只能删除空目录,否则会抛出 OSError。要删除非空目录需要使用 shutil.rmtree(),它会递归删除整个目录树,使用时需特别小心。

# 删除空目录
os.rmdir('empty_directory')

# 删除目录树 (谨慎使用!)
import shutil
shutil.rmtree('directory_with_contents')

3. 遍历目录

需求场景:

os.listdir() 只返回指定目录的直接内容,不包含子目录内容。os.walk() 是生成器函数,会递归遍历所有子目录,返回三元组(当前目录路径,子目录列表,文件列表)。可以通过修改 dirs 列表来控制遍历过程。

# 列出目录内容
print("当前目录内容:")
for item in os.listdir('.'):
    print(item)

# 使用os.walk递归遍历目录
print("\n递归遍历目录结构:")
for root, dirs, files in os.walk('.'):
    print(f"当前目录: {root}")
    print(f"子目录: {dirs}")
    print(f"文件: {files}")
    print("-" * 40)

四、文件操作

1. 文件重命名

需求场景:

os.rename() 也可以用于移动文件(如果在不同目录下)。如果目标文件已存在,在Windows上会抛出 FileExistsError,在Unix系统上会静默覆盖。

os.rename('old_name.txt', 'new_name.txt')

# 为日志文件添加日期前缀
log_file = "app.log"
today = datetime.now().strftime("%Y%m%d")
new_name = f"{today}_{log_file}"
os.rename(log_file, new_name)

2. 删除文件

需求场景:

os.remove() 只能删除文件,不能删除目录。删除前最好检查文件是否存在和是否有权限删除。

os.remove('file_to_delete.txt')
# 删除一周前的临时文件(基于文件修改时间进行选择性删除)
for file in os.listdir('temp'):
    file_path = os.path.join('temp', file)
    if os.path.isfile(file_path):
        file_age = time.time() - os.path.getmtime(file_path)
        if file_age > 7 * 24 * 3600:  # 7天
            os.remove(file_path)

3. 获取文件信息

需求场景:

os.stat() 返回的 st_mtime 和 st_ctime 是时间戳(秒数),可以使用 datetime.fromtimestamp() 转换为可读格式。

file_stat = os.stat('some_file.txt')
print(f"文件大小: {file_stat.st_size} 字节")
print(f"最后修改时间: {file_stat.st_mtime}")
print(f"创建时间: {file_stat.st_ctime}")

五、环境变量操作

需求场景:

通过 os.environ 设置的环境变量只在当前进程及其子进程中有效,不会影响系统环境变量。os.getenv() 比直接访问 os.environ 更安全,因为当变量不存在时可以指定默认值。

# 获取环境变量
home_dir = os.getenv('HOME')  # 或 os.environ.get('HOME')
print(f"用户主目录: {home_dir}")

# 设置环境变量(仅当前进程有效)
os.environ['MY_VAR'] = 'some_value'
print(f"MY_VAR: {os.getenv('MY_VAR')}")

六、跨平台路径处理

需求场景:

os.path 模块提供了跨平台的路径处理方法,os.path.normpath() 会解析路径中的 . 和 …,并标准化路径分隔符。os.path.abspath() 会将路径转换为绝对路径,基于当前工作目录。os.path.commonpath()os.path.commonprefix() 更准确,因为它会考虑路径分隔符。

path = "/home/user/docs/file.txt"

print(f"路径分隔符: {os.path.sep}")  # Linux: /, Windows: \
print(f"路径标准化: {os.path.normpath('docs/../docs/file.txt')}")
print(f"绝对路径: {os.path.abspath('file.txt')}")
print(f"共同前缀: {os.path.commonprefix(['/usr/lib', '/usr/local/lib'])}")  # /usr/l
print(f"共同路径: {os.path.commonpath(['/usr/lib', '/usr/local/lib'])}")  # /usr

七、实用示例

示例1:批量重命名文件

需求场景:

示例展示了如何批量修改文件名。在实际应用中,可以扩展为更复杂的重命名规则,如添加序号、修改扩展名、根据文件内容重命名等。

def batch_rename(directory, prefix):
    """为目录中的所有文件添加前缀"""
    for filename in os.listdir(directory):
        if os.path.isfile(os.path.join(directory, filename)):
            new_name = prefix + filename
            os.rename(
                os.path.join(directory, filename),
                os.path.join(directory, new_name)
            )
            print(f"重命名: {filename} -> {new_name}")

# 使用示例
batch_rename('./photos', 'vacation_')

示例2:查找特定扩展名的文件

需求场景:

使用 os.walk() 递归搜索目录。file.endswith() 是大小写敏感的,如果需要不区分大小写,可以改为 file.lower().endswith(extension.lower())

def find_files_by_extension(directory, extension):
    """递归查找目录中特定扩展名的文件"""
    matches = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(extension):
                matches.append(os.path.join(root, file))
    return matches

# 使用示例
py_files = find_files_by_extension('.', '.py')
print("找到的Python文件:")
for file in py_files:
    print(file)

示例3:计算目录大小

需求场景:

这个函数计算的是目录中所有文件的实际大小总和,不包括目录元数据占用的空间。跳过了符号链接以避免重复计算或无限递归。对于非常大的目录,可能需要优化性能。

def get_directory_size(directory):
    """计算目录总大小(字节)"""
    total = 0
    for dirpath, dirnames, filenames in os.walk(directory):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            # 跳过符号链接
            if not os.path.islink(fp):
                total += os.path.getsize(fp)
    return total

# 使用示例
size = get_directory_size('./')
print(f"目录总大小: {size} 字节 ({size/1024/1024:.2f} MB)")

八、安全注意事项

  1. 使用 os.path 而不是手动拼接路径,确保跨平台兼容性
  2. 执行删除操作前先检查路径是否存在
  3. 处理用户提供的路径时要小心,防止目录遍历攻击
  4. 考虑使用 try-except 处理可能的异常

文件操作可能引发多种异常,如权限不足、文件不存在、路径无效等。对于关键操作,建议先检查再执行,并做好异常处理。

try:
    os.remove('important_file.txt')
except FileNotFoundError:
    print("文件不存在,无需删除")
except PermissionError:
    print("没有删除文件的权限")

九、总结

掌握Python 的 os 模块,为操作文件和目录提供更多便利:

在实际开发中,可以根据具体需求选择合适的函数,并注意异常处理和跨平台兼容性。

以上就是Python使用os模块操作文件与目录的完整指南的详细内容,更多关于Python os模块操作文件与目录的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文