当前位置: 代码网 > it编程>前端脚本>Python > Python使用os模块操作文件与目录的完整指南

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

2026年01月27日 Python 我要评论
一、os 模块是什么os 模块是python标准库的一部分,无需额外安装即可使用。它封装了不同操作系统(windows、linux、macos等)的底层系统调用,提供了一致的接口使用,它可以让我们在p

一、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. 路径拼接

需求场景:

  • 构建跨平台的路径时(windows用\,linux和mac用/)
  • 动态组合路径各部分
  • 避免手动拼接路径导致的错误

使用 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}")

五、环境变量操作

需求场景:

  • 读取系统配置
  • 根据环境改变程序行为(开发/生产环境)
  • 安全存储敏感信息(如api密钥)

通过 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:查找特定扩展名的文件

需求场景:

  • 收集所有日志文件(.log)进行分析
  • 查找项目中的所有图片资源(.jpg,.png)
  • 统计源代码文件数量(.py等)

使用 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模块操作文件与目录的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com