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

 更新时间:2026年08月26日 08:58:04   作者:何以解忧,唯有..  
Python 的 os 模块是标准库中用于与操作系统交互的核心模块之一,它提供了丰富的函数来执行文件和目录操作、进程管理、环境变量访问等系统级任务,本文将详细介绍 os 模块的主要功能,包括文件与目录操作、路径处理、环境变量管理以及跨平台兼容性等内容

1. 引言

Python 的 os 模块是标准库中用于与操作系统交互的核心模块之一。它提供了丰富的函数来执行文件和目录操作、进程管理、环境变量访问等系统级任务。无论是编写简单的脚本还是复杂的应用程序,掌握 os 模块都是 Python 开发者的必备技能。

本文将详细介绍 os 模块的主要功能,包括文件与目录操作、路径处理、环境变量管理以及跨平台兼容性等内容,并提供实用的代码示例。

2. os模块基础

2.1 导入模块

import os

2.2 常用子模块

os 模块包含多个子模块,其中最常用的是:

  • os.path:专门用于路径操作
  • os.environ:环境变量访问
  • os.system:执行系统命令

3. 文件与目录操作

3.1 获取当前工作目录

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

3.2 改变工作目录

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

3.3 列出目录内容

# 列出目录中的所有文件和子目录
contents = os.listdir('.')
print(f"当前目录内容: {contents}")

# 使用 os.scandir() 获取更详细的信息(推荐)
with os.scandir('.') as entries:
    for entry in entries:
        print(f"{entry.name} - 是目录: {entry.is_dir()}")

3.4 创建和删除目录

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

# 创建多级目录
os.makedirs('parent/child/grandchild', exist_ok=True)

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

# 删除多级目录(谨慎使用)
import shutil
shutil.rmtree('parent')  # 需要导入 shutil 模块

3.5 文件操作

# 重命名文件或目录
os.rename('old_name.txt', 'new_name.txt')

# 删除文件
os.remove('file_to_delete.txt')

# 检查文件或目录是否存在
if os.path.exists('some_file.txt'):
    print("文件存在")
else:
    print("文件不存在")

4. 路径操作(os.path子模块)

os.path 是处理文件路径的强大工具,它自动处理不同操作系统的路径分隔符差异。

4.1 路径拼接与分解

import os.path

# 路径拼接(跨平台安全)
full_path = os.path.join('folder', 'subfolder', 'file.txt')
print(f"完整路径: {full_path}")

# 分解路径
dirname = os.path.dirname(full_path)  # 'folder/subfolder'
basename = os.path.basename(full_path)  # 'file.txt'
split_result = os.path.split(full_path)  # ('folder/subfolder', 'file.txt')

print(f"目录部分: {dirname}")
print(f"文件名部分: {basename}")
print(f"拆分结果: {split_result}")

4.2 路径信息获取

# 获取绝对路径
abs_path = os.path.abspath('relative/path/file.txt')

# 获取文件大小(字节)
file_size = os.path.getsize('file.txt')
print(f"文件大小: {file_size} 字节")

# 获取文件最后修改时间
mod_time = os.path.getmtime('file.txt')
from datetime import datetime
print(f"最后修改: {datetime.fromtimestamp(mod_time)}")

# 检查路径类型
print(f"是文件: {os.path.isfile('file.txt')}")
print(f"是目录: {os.path.isdir('folder')}")
print(f"是链接: {os.path.islink('link.txt')}")

4.3 路径规范化

# 规范化路径(处理 . 和 ..)
norm_path = os.path.normpath('folder/../folder/./file.txt')
print(f"规范化路径: {norm_path}")

# 获取真实路径(解析符号链接)
real_path = os.path.realpath('link_to_file.txt')

5. 环境变量管理

5.1 访问环境变量

# 获取所有环境变量
env_vars = os.environ
print(f"环境变量数量: {len(env_vars)}")

# 获取特定环境变量
home_dir = os.environ.get('HOME')  # Linux/macOS
user_profile = os.environ.get('USERPROFILE')  # Windows
path_var = os.environ.get('PATH')

print(f"家目录: {home_dir or user_profile}")
print(f"PATH变量: {path_var}")

5.2 设置环境变量

# 设置环境变量(当前进程有效)
os.environ['MY_VARIABLE'] = 'my_value'

# 检查设置是否成功
print(f"MY_VARIABLE: {os.environ.get('MY_VARIABLE')}")

6. 执行系统命令

6.1 简单命令执行

# 执行系统命令(返回退出状态码)
exit_code = os.system('ls -la' if os.name != 'nt' else 'dir')
print(f"命令退出码: {exit_code}")

6.2 获取命令输出

import subprocess  # 更推荐使用 subprocess 模块

# 获取命令输出
result = subprocess.run(['ls', '-la'], capture_output=True, text=True)
print(f"命令输出:\n{result.stdout}")

7. 跨平台兼容性

7.1 操作系统检测

# 获取操作系统名称
print(f"操作系统: {os.name}")  # 'posix', 'nt', 'java'

# 更精确的平台检测
import platform
print(f"系统平台: {platform.system()}")  # 'Linux', 'Windows', 'Darwin'
print(f"平台版本: {platform.release()}")

7.2 路径分隔符

# 路径分隔符常量
print(f"路径分隔符: {os.path.sep}")
print(f"路径分隔符列表: {os.pathsep}")
print(f"行结束符: {repr(os.linesep)}")

# 使用 os.path.join 自动处理分隔符
path = os.path.join('usr', 'local', 'bin')
print(f"跨平台路径: {path}")

8. 进程管理

8.1 进程信息

# 获取当前进程ID
pid = os.getpid()
print(f"当前进程ID: {pid}")

# 获取父进程ID
ppid = os.getppid()
print(f"父进程ID: {ppid}")

# 获取当前用户ID
uid = os.getuid() if hasattr(os, 'getuid') else None
print(f"用户ID: {uid}")

8.2 进程控制

# 创建子进程(Unix-like 系统)
if hasattr(os, 'fork'):
    pid = os.fork()
    if pid == 0:
        print("这是子进程")
        os._exit(0)
    else:
        print(f"这是父进程,子进程ID: {pid}")

9. 实用示例

9.1 遍历目录树

def list_files_recursively(directory):
    """递归列出目录中的所有文件"""
    file_list = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            full_path = os.path.join(root, file)
            file_list.append(full_path)
    return file_list

# 使用示例
all_files = list_files_recursively('.')
print(f"找到 {len(all_files)} 个文件")

9.2 批量重命名文件

def batch_rename_files(directory, old_ext, new_ext):
    """批量修改文件扩展名"""
    for filename in os.listdir(directory):
        if filename.endswith(old_ext):
            old_path = os.path.join(directory, filename)
            new_name = filename.replace(old_ext, new_ext)
            new_path = os.path.join(directory, new_name)
            os.rename(old_path, new_path)
            print(f"重命名: {filename} -> {new_name}")

# 使用示例
# batch_rename_files('./docs', '.txt', '.md')

9.3 创建项目目录结构

def create_project_structure(project_name):
    """创建标准的项目目录结构"""
    directories = [
        project_name,
        os.path.join(project_name, 'src'),
        os.path.join(project_name, 'tests'),
        os.path.join(project_name, 'docs'),
        os.path.join(project_name, 'data'),
        os.path.join(project_name, 'logs'),
    ]
    
    for directory in directories:
        os.makedirs(directory, exist_ok=True)
        print(f"创建目录: {directory}")
    
    # 创建基础文件
    files = [
        os.path.join(project_name, 'README.md'),
        os.path.join(project_name, 'requirements.txt'),
        os.path.join(project_name, '.gitignore'),
    ]
    
    for file_path in files:
        with open(file_path, 'w') as f:
            f.write('# ' + os.path.basename(file_path) + '\n')
        print(f"创建文件: {file_path}")

# 使用示例
# create_project_structure('my_project')

10. 注意事项与最佳实践

10.1 错误处理

import os
import errno

def safe_remove(filepath):
    """安全删除文件,避免异常"""
    try:
        os.remove(filepath)
        print(f"成功删除: {filepath}")
    except OSError as e:
        if e.errno != errno.ENOENT:  # 文件不存在不是错误
            print(f"删除失败: {e}")
        else:
            print(f"文件不存在: {filepath}")

10.2 路径安全性

def is_safe_path(base_path, target_path):
    """检查目标路径是否在基础路径内(防止路径遍历攻击)"""
    base = os.path.abspath(base_path)
    target = os.path.abspath(target_path)
    return os.path.commonpath([base, target]) == base

# 使用示例
if is_safe_path('/safe/directory', '/safe/directory/sub/file.txt'):
    print("路径安全")
else:
    print("路径不安全!")

10.3 性能考虑

  1. 使用 os.scandir() 代替 os.listdir()os.scandir() 在遍历大目录时性能更好
  2. 避免频繁的 os.path.exists() 调用:在竞争条件下,文件状态可能在你检查后立即改变
  3. 使用 os.walk() 进行递归遍历:比自己实现递归更高效

11. 总结

Python 的 os 模块提供了强大的系统交互能力,是文件操作、目录管理、环境变量访问等任务的基石。通过本文的介绍,你应该已经掌握了:

  1. 基础操作:目录创建、文件重命名、路径处理
  2. 高级功能:环境变量管理、进程控制、跨平台兼容
  3. 最佳实践:错误处理、路径安全、性能优化

在实际开发中,建议结合 pathlib 模块(Python 3.4+)使用,它提供了更面向对象的路径操作方式。但 os 模块仍然是处理低级系统操作的重要工具。

记住:在进行文件系统操作时,始终要考虑错误处理、权限问题和跨平台兼容性,这样才能编写出健壮可靠的 Python 代码。

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

相关文章

  • Python中字典和JSON互转操作实例

    Python中字典和JSON互转操作实例

    这篇文章主要介绍了Python中字典和JSON互转操作实例,本文给出了Dict转JSON、读取JSON并转为Dict示例,需要的朋友可以参考下
    2015-01-01
  • python NumPy ndarray二维数组 按照行列求平均实例

    python NumPy ndarray二维数组 按照行列求平均实例

    今天小编就为大家分享一篇python NumPy ndarray二维数组 按照行列求平均实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-11-11
  • python3的print()函数的用法图文讲解

    python3的print()函数的用法图文讲解

    在本篇内容里小编给各位分享的是关于python3的print()函数的用法知识点,对此有需要的朋友们跟着学习下吧。
    2019-07-07
  • 使用PyInstaller 打包配置文件

    使用PyInstaller 打包配置文件

    这篇文章主要介绍了使用PyInstaller 打包配置文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • 深入解析 Python 的 argparse命令行参数的实战案例

    深入解析 Python 的 argparse命令行参数的实战案例

    argparse是开发Python命令行工具不可或缺的标准模块,它功能全面、文档丰富、学习曲线平缓,只要掌握了它,你就可以轻松将任何 Python 脚本变成一个强大、优雅、可维护的命令行工具,本文带领深入解析Python的argparse命令行参数,需要的朋友跟随小编一起看看吧
    2025-08-08
  • Python实现生成随机数据插入mysql数据库的方法

    Python实现生成随机数据插入mysql数据库的方法

    这篇文章主要介绍了Python实现生成随机数据插入mysql数据库的方法,涉及Python随机字符串生成及数据库连接、插入等相关操作技巧,需要的朋友可以参考下
    2017-12-12
  • 解决Python Pandas DataFrame表格打印输出不能对齐的问题

    解决Python Pandas DataFrame表格打印输出不能对齐的问题

    这篇文章主要介绍了解决Python Pandas DataFrame表格打印输出不能对齐的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Python如何同时读写Excel

    Python如何同时读写Excel

    这篇文章主要介绍了Python如何同时读写Excel问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-08-08
  • Python 代码在函数中运行得更快的原因解析

    Python 代码在函数中运行得更快的原因解析

    我们知道,python 是一种解释型语言,它会逐行读取并执行代码,小伙伴们可能会有这个疑问:为什么在函数中运行的 Python 代码速度更快,今天这篇文章将会解答大家心中的疑惑
    2023-09-09
  • python更加灵活的Logger日志详解

    python更加灵活的Logger日志详解

    这篇文章主要介绍了python Logger日志,用到的4个类,针对每个知识点给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论