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

作者:

文章目录
  • os 模块是Python标准库的一部分,无需额外安装即可使用。它封装了不同操作系统(Windows、Linux、MacOS等)的底层系统调用,提供了一致的接口使用,它可以让我们在Python中执行各种操作系统级别的任务,如创建/删除目录、遍历文件系统、管理文件路径等。
  • 需求场景: 读取系统配置 根据环境改变程序行为(开发/生产环境) 安全存储敏感信息(如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
  • 使用 os.path 而不是手动拼接路径,确保跨平台兼容性 执行删除操作前先检查路径是否存在 处理用户提供的路径时要小心,防止目录遍历攻击 考虑使用 try-except 处理可能的异常 文件操作可能引发多种异常,如权限不足、文件不存在、路径无效等。对于关键操作,建议先检查再执行,并做好异常处理。 try: os.remove(‘important_file.txt’) except FileNotFoundError: print(“文件不存在,无需删除”) except PermissionError: print(“没有删除文件的权限”)
  • 掌握Python 的 os 模块,为操作文件和目录提供更多便利: 安全地处理各种路径操作 创建、删除和遍历目录结构 管理文件和获取文件信息 访问和修改环境变量 编写跨平台的脚本 在实际开发中,可以根据具体需求选择合适的函数,并注意异常处理和跨平台兼容性。 以上就是Python使用os模块操作文件与目录的完整指南的详细内容,更多关于Python os模块操作文件与目录的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python使用os模块进行高级文件操作的详细指南(遍历、移动、复制和删除文件和目录) 关于Python OS模块常用文件/目录函数详解 python文件目录操作之os模块 Python使用os模块和fileinput模块来操作文件目录
  • 目录
    • 一、os 模块是什么
    • 二、路径操作
      • 1. 获取当前工作目录
      • 2. 改变工作目录
      • 3. 路径拼接
      • 4. 路径分解与提取
      • 5. 路径有效性检查
    • 三、目录操作
      • 1. 创建目录
      • 2. 删除目录
      • 3. 遍历目录
    • 四、文件操作
      • 1. 文件重命名
      • 2. 删除文件
      • 3. 获取文件信息
    • 五、环境变量操作
      • 六、跨平台路径处理
        • 七、实用示例
          • 示例1:批量重命名文件
          • 示例2:查找特定扩展名的文件
          • 示例3:计算目录大小
        • 八、安全注意事项
          • 九、总结

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

            需求场景:

            • 需要知道脚本当前运行的位置
            • 需要基于当前目录构建相对路径
            • 调试时确认程序的工作目录是否正确

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

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

            需求场景:

            • 需要切换到特定目录进行操作
            • 处理相对路径前确保在正确的目录下
            • 临时切换到某个目录处理文件后又需要返回原目录

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

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

            需求场景:

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

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

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

            需求场景:

            • 需要单独获取文件名或目录名
            • 批量处理文件扩展名
            • 分析用户提供的文件路径

            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
            

            需求场景:

            • 处理输入路径前验证有效性
            • 确保文件/目录存在再进行操作
            • 编写安装脚本时需要检查目标位置

            这些检查函数不会抛出异常,而是返回布尔值。对于符号链接,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)}")
            

            需求场景:

            • 程序需要生成输出目录
            • 安装程序创建必要的目录结构
            • 上传文件前确保目标目录存在

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

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

            需求场景:

            • 清理临时目录
            • 卸载程序删除相关目录
            • 定期清理旧数据

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

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

            需求场景:

            • 批量处理目录中的文件
            • 实现文件搜索功能
            • 统计目录内容
            • 备份目录结构

            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)
            

            需求场景:

            • 批量重命名文件
            • 添加时间戳到文件名

            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)
            

            需求场景:

            • 清理临时文件
            • 实现文件删除功能
            • 定期清理旧文件

            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)
            

            需求场景:

            • 显示文件详细信息
            • 按大小/时间筛选文件

            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
            

            需求场景:

            • 整理照片库(添加日期/地点前缀)
            • 标准化下载的文件名
            • 批量修改项目中的资源文件名

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

            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_')
            

            需求场景:

            • 收集所有日志文件(.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)
            

            需求场景:

            • 实现磁盘空间检查功能
            • 限制用户上传目录的大小
            • 分析项目各模块占用空间

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

            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模块操作文件与目录的资料请关注风君子博客其它相关文章!

            您可能感兴趣的文章:

            • Python使用os模块进行高级文件操作的详细指南(遍历、移动、复制和删除文件和目录)
            • 关于Python OS模块常用文件/目录函数详解
            • python文件目录操作之os模块
            • Python使用os模块和fileinput模块来操作文件目录

            站内搜索