os 模块是 Python 与操作系统之间的桥梁,提供了大量与平台无关的接口,用来操作文件目录、执行系统命令、读取环境变量等。掌握了它,你写的脚本就能在多台不同系统的机器上跑出同样的效果。
系统调用
最常用的是 os.system(command),它直接在子 shell 里执行一条命令字符串,并返回退出状态码。例如在自动清理脚本中运行系统命令:
os.system('rm -rf /tmp/cache')
不过 os.system 存在安全隐患(如命令注入),也无法精细获取输出。现在更推荐标准库的 subprocess 模块来替代。
在 Unix 系统中,os 还提供 fork()、exec*() 等底层进程控制函数,但它们很少在普通应用代码中使用,一般只在框架或高级并发需求里才会碰到。
目录操作
- 创建目录
os.mkdir(path) 只能创建最后一级目录,父目录必须存在;os.makedirs(name, exist_ok=True) 能递归创建多层目录,exist_ok 参数让你不用担心目录已存在而报错。
- 删除目录
os.rmdir(path) 删除空目录;要删除非空目录,请用高级模块 shutil.rmtree(见 13.3 节)。
- 列出目录内容
os.listdir(path) 返回一个包含所有文件、子目录名的列表;os.scandir(path) 则返回一个生成 DirEntry 对象的迭代器,一次系统调用就能拿到名称、文件类型、大小等信息,效率更高。
- 切换工作目录
os.getcwd() 获取当前工作目录,os.chdir(path) 切换到指定路径。
示例:
import os
# 递归创建目录
os.makedirs('data/2025/raw', exist_ok=True)
# 高效遍历目录
with os.scandir('data') as entries:
for entry in entries:
if entry.is_file():
print(entry.name, entry.stat().st_size)
路径处理(os.path 子模块)
历史上很长一段时间,os.path 是 Python 处理文件路径的唯一手段,因此大量项目代码都在使用它。即使现在更推荐 pathlib,掌握 os.path 依然很实用。
os.path.join('a', 'b', 'c.txt'):自动使用正确的路径分隔符拼接。os.path.split(path):拆分为目录部分和文件名部分。os.path.splitext(path):分离文件名与扩展名。os.path.exists(path)/isfile()/isdir():判断路径的性质与存在性。os.path.abspath(path):获取绝对路径。os.sep常量:当前系统的路径分隔符(Windows 是\,Linux/macOS 是/),写一些硬拼接的字符串时可以用上。
path = os.path.join('logs', 'app.log')
if os.path.exists(path):
base, ext = os.path.splitext(path)
print(f"文件名:{base},扩展名:{ext}")
环境变量
os.environ 是一个字典对象,存储了当前进程的所有环境变量。读取时推荐用 os.getenv() 方法,它能设置默认值,避免因变量缺失而抛出异常。
- 读取:
db_host = os.getenv('DB_HOST', 'localhost') - 设置:
os.environ['MY_VAR'] = 'value'(仅影响当前进程及其子进程) - 删除:
del os.environ['MY_VAR']
环境变量最适合存放敏感配置(数据库密码、API 密钥)或需要根据部署环境变化的参数(如环境标识 ENV=production),避免将这些信息硬编码在代码中。
几点实用建议
- 新旧交替:对于路径拼接、判断等纯路径操作,新项目应优先用
pathlib(13.4 节),代码更清晰;但在处理文件描述符、执行系统命令、遍历目录时,os模块的功能仍然不可替代。 - 防御性编程:所有涉及文件删除、移动的操作,最好先用
os.path.exists或try...except做保护。 - 跨平台注意:虽然
os已经屏蔽了很多差异,但像文件权限、os.chmod这类操作在 Windows 和 Unix 上行为不同,编写跨平台脚本时最好阅读一下官方文档的相关说明。
总之,os 模块是你与操作系统对话的“母语”,熟悉它的常用功能,能让你在脚本自动化、日常文件管理的场景里游刃有余。