Python os 模块使用指南:系统交互的瑞士军刀
作者:书到用时方恨少!
发布日期:2026年3月29日
阅读时长:约18分钟
📌 前言
在 Python 开发中,与操作系统进行交互是极其常见的需求:管理文件、读取环境变量、执行系统命令、处理路径......这些任务都离不开 os 模块 。作为 Python 标准库中最重要的模块之一,os 提供了丰富的函数,让你能够以跨平台的方式调用操作系统底层功能。
无论你是刚入门的 Python 爱好者,还是需要编写自动化脚本的开发者,这篇博客都将带你系统掌握 os 模块的核心用法。我们将从基础操作讲起,逐步深入到实战案例,并通过大量代码示例帮助你快速上手。
1. 📦 os 模块简介
os 模块是 Python 标准库的一部分,直接导入即可使用:
python
import os
它封装了操作系统相关的功能,包括:
- 文件和目录的增删改查
- 路径的拼接、拆分、判断
- 环境变量的获取与设置
- 进程管理(如执行命令、获取进程ID)
- 权限控制
- 等等
注意 :由于不同操作系统(Windows、Linux、macOS)的底层 API 存在差异,
os模块会尽量提供统一的接口,但某些功能(如文件权限)在不同平台上的表现可能有所不同。建议在编写跨平台代码时,结合os.name或sys.platform进行判断。
2. 🖥️ 获取系统信息
在开始操作之前,我们通常需要了解当前系统的类型和环境。
🧭 操作系统名称
python
print(os.name) # 'posix'(Linux/macOS) 或 'nt'(Windows)
🏁 平台详细信息
python
import sys
print(sys.platform) # 'win32'、'linux'、'darwin'(macOS)等
🗺️ 当前工作目录
python
print(os.getcwd()) # 获取当前工作目录(绝对路径)
🔢 进程ID
python
print(os.getpid()) # 当前进程的PID
👤 用户信息(部分平台)
python
print(os.getlogin()) # 登录用户名(可能存在安全限制)
3. 📁 文件和目录操作
这是 os 模块最常用的功能之一。
📂 创建目录
python
# 创建单层目录
os.mkdir('test_dir') # 如果目录已存在会抛出 FileExistsError
# 创建多层目录(类似 mkdir -p)
os.makedirs('a/b/c', exist_ok=True) # exist_ok=True 避免目录存在时报错
🗑️ 删除目录
python
# 删除空目录
os.rmdir('test_dir')
# 递归删除目录(包括非空目录,谨慎使用!)
import shutil
shutil.rmtree('a') # 使用 shutil 模块更安全
📝 删除文件
python
os.remove('file.txt') # 删除文件
os.unlink('file.txt') # 与 remove 相同
🔄 重命名文件或目录
python
os.rename('old.txt', 'new.txt') # 可以重命名文件或目录
📋 列出目录内容
python
entries = os.listdir('.') # 返回当前目录下所有文件和目录的名称列表
print(entries)
# 更详细的信息(推荐)
with os.scandir('.') as entries:
for entry in entries:
print(entry.name, entry.is_file(), entry.is_dir())
scandir 比 listdir 更高效,因为它返回的对象可以直接获取文件类型等元数据,避免了额外的系统调用。
🔍 遍历目录树
使用 os.walk 递归遍历目录树:
python
for root, dirs, files in os.walk('.'):
print(f"当前目录: {root}")
print(f"子目录: {dirs}")
print(f"文件: {files}")
print('---')
4. 🧭 路径操作(os.path)
os.path 子模块提供了与操作系统无关的路径操作,是处理文件路径的最佳选择。
🔗 路径拼接
python
path = os.path.join('folder', 'sub', 'file.txt')
print(path) # 'folder/sub/file.txt' (Linux) 或 'folder\\sub\\file.txt' (Windows)
🧩 拆分路径
python
# 拆分目录和文件名
dirname, basename = os.path.split('/home/user/file.txt')
print(dirname) # '/home/user'
print(basename) # 'file.txt'
# 拆分文件名和扩展名
root, ext = os.path.splitext('file.txt')
print(root) # 'file'
print(ext) # '.txt'
✅ 判断路径类型
python
os.path.exists('file.txt') # 是否存在
os.path.isfile('file.txt') # 是否为文件
os.path.isdir('folder') # 是否为目录
os.path.isabs('/home/user') # 是否为绝对路径
📏 获取绝对路径
python
abs_path = os.path.abspath('file.txt')
print(abs_path)
🔄 规范化路径
python
print(os.path.normpath('a/../b/./c')) # 'b/c'
5. 🌍 环境变量管理
环境变量是操作系统级别的键值对,常用来存储配置信息。
🔍 获取环境变量
python
# 如果变量不存在,返回 None
home = os.getenv('HOME')
print(home)
# 如果变量不存在,返回默认值
path = os.getenv('PATH', '/default/path')
# 或者使用 os.environ 字典
print(os.environ['USER']) # 如果不存在会抛出 KeyError
✍️ 设置环境变量
python
os.environ['MY_VAR'] = 'hello'
# 注意:修改只对当前进程及其子进程有效,不会影响系统环境
🗑️ 删除环境变量
python
del os.environ['MY_VAR']
6. ⚙️ 进程管理
os 模块提供了执行系统命令和创建子进程的功能。
🚀 执行系统命令
方法一:os.system()
python
# 执行命令并返回退出码
ret = os.system('ls -l') # Linux/macOS
ret = os.system('dir') # Windows
print(ret) # 0 表示成功
简单但功能有限,无法获取命令输出。
方法二:os.popen()(不推荐)
python
with os.popen('ls -l') as f:
output = f.read()
print(output)
更现代的方式是使用 subprocess 模块,推荐掌握。
👶 创建子进程
os.fork() 仅在 Unix 系统上可用,用于创建子进程(复制当前进程)。在 Windows 上不可用,因此一般使用 multiprocessing 模块。
🆔 获取进程ID和父进程ID
python
pid = os.getpid()
ppid = os.getppid() # 仅在 Unix 上有效
7. 🔐 权限和文件属性
📊 文件状态(stat)
python
stat_info = os.stat('file.txt')
print(stat_info.st_size) # 文件大小(字节)
print(stat_info.st_mtime) # 最后修改时间(时间戳)
print(stat_info.st_mode) # 权限模式(八进制表示)
🔧 修改权限(Unix)
python
# 设置文件为只读(八进制 0o444)
os.chmod('file.txt', 0o444)
# 设置文件为可读写(0o666)
os.chmod('file.txt', 0o666)
👥 文件所有者(Unix)
python
# 获取 uid 和 gid
uid = os.stat('file.txt').st_uid
gid = os.stat('file.txt').st_gid
# 修改所有者(需要 root 权限)
os.chown('file.txt', uid, gid)
8. 💡 高级技巧与实战案例
🔄 临时文件与目录
使用 tempfile 模块可以安全地创建临时文件/目录:
python
import tempfile
# 创建临时文件
with tempfile.NamedTemporaryFile(mode='w+') as f:
f.write('hello')
f.flush()
print(f.name) # 文件路径,退出时自动删除
# 创建临时目录
with tempfile.TemporaryDirectory() as tmpdir:
print(tmpdir) # 目录路径,退出时自动删除
📂 安全地创建目录
如果目录不存在则创建,存在则跳过:
python
def ensure_dir(path):
os.makedirs(path, exist_ok=True)
🧪 模拟文件系统(用于测试)
在单元测试中,可以使用 unittest.mock.patch 模拟文件系统,避免污染真实环境。
📝 遍历并处理文件
python
def process_files(root_dir, extension):
for root, dirs, files in os.walk(root_dir):
for file in files:
if file.endswith(extension):
full_path = os.path.join(root, file)
print(f"处理文件: {full_path}")
# 在这里添加你的处理逻辑
🗑️ 删除旧的日志文件(保留最近 N 个)
python
import glob
def delete_old_logs(log_dir, keep=5):
logs = sorted(glob.glob(os.path.join(log_dir, '*.log')), key=os.path.getmtime)
for log in logs[:-keep]:
os.remove(log)
🔁 跨平台路径处理技巧
使用 os.path.join 而不是硬编码路径分隔符:
python
# 错误:data_dir = 'data/' + filename
# 正确:
data_dir = os.path.join('data', filename)
🧩 获取用户主目录
python
home = os.path.expanduser('~')
print(home) # 如 '/home/username' 或 'C:\\Users\\username'
🏗️ 动态导入模块(结合路径)
python
import importlib.util
def load_module_from_path(module_name, file_path):
spec = importlib.util.spec_from_file_location(module_name, file_path)
module = importlib.util.module_from_spec(spec)
spec.loader.exec_module(module)
return module
9. ⚙️ 性能与注意事项
- 尽量使用
os.path.join:避免手动拼接路径分隔符,确保跨平台兼容。 - 使用
with语句 :对于文件操作,使用with open(...) as f:确保资源正确释放。 - 小心
shutil.rmtree:删除非空目录前请确保没有重要数据,最好先备份。 - 避免使用
os.system:推荐使用subprocess模块,提供更强大和安全的进程管理。 - 路径中的空格 :使用
shlex.quote或subprocess的列表参数方式避免空格问题。 - 权限错误:在修改文件权限或删除系统文件时,确保进程拥有足够的权限。
10. 🎯 总结
通过本文,我们全面学习了 Python os 模块的:
- ✅ 系统信息获取
- ✅ 文件和目录操作(创建、删除、重命名、遍历)
- ✅ 路径处理(
os.path) - ✅ 环境变量管理
- ✅ 进程管理
- ✅ 权限与文件属性
- ✅ 实战案例
os 模块是 Python 与操作系统交互的核心工具,掌握它将极大提升你在文件管理、脚本编写、系统运维等领域的开发效率。
最后提醒:在编写涉及系统操作的代码时,一定要谨慎测试,特别是涉及删除、修改权限等破坏性操作时,建议先在临时环境中验证。
如果在使用过程中遇到问题,欢迎在评论区留言交流。感谢阅读,我们下篇见! 🚀