Python os模块完全指南:从入门到实战
一、os
模块概述
os模块是Python标准库中与操作系统交互的核心工具,它封装了底层操作系统接口,为开发者提供了跨平台的统一API。该模块主要包含以下几类功能:
-
文件和目录操作:
- 创建/删除文件(os.remove())
- 创建/删除目录(os.mkdir()/os.rmdir())
- 文件重命名(os.rename())
- 遍历目录(os.listdir())
-
路径管理:
- 路径拼接(os.path.join())
- 路径分割(os.path.split())
- 获取绝对路径(os.path.abspath())
- 检查路径存在性(os.path.exists())
-
系统环境访问:
- 获取环境变量(os.environ)
- 执行系统命令(os.system())
- 获取当前工作目录(os.getcwd())
- 修改工作目录(os.chdir())
典型应用场景包括:
- 批量重命名文件
- 递归遍历目录结构
- 系统环境检测
- 跨平台路径处理
- 自动化脚本编写
该模块属于Python内置标准库,无需额外安装,通过import os
即可直接使用。其API设计遵循"一次编写,多平台运行"的原则,自动适配Windows、Linux、macOS等不同操作系统。在系统编程、自动化运维、文件处理等场景中都是基础必备模块。
import os
二、核心功能与API详解
1. 路径管理(os.path
子模块)
▶ os.path.join()
- 跨平台路径拼接
os.path.join(path1, path2, ...)
-
参数:接受多个字符串参数,按顺序拼接
-
作用:自动适配当前系统的路径分隔符(Windows用
\
,Linux/macOS用/
)
# 示例:跨平台拼接路径
path = os.path.join('data', 'mnist', 'train') # Windows: data\mnist\train
print(path)
▶ os.path.abspath()
- 获取绝对路径
os.path.abspath(relative_path)
-
参数:相对路径字符串
-
返回值:绝对路径字符串
# 示例:获取当前脚本的绝对路径
abs_path = os.path.abspath(__file__)
print(f"脚本绝对路径:{abs_path}")
▶ os.path.dirname()
- 获取父目录
os.path.dirname(path)
-
参数:文件或目录路径
-
返回值:上级目录路径
# 示例:获取当前脚本的父目录
parent_dir = os.path.dirname(__file__)
print(f"父目录:{parent_dir}")
2. 文件与目录操作
▶ os.makedirs()
- 递归创建目录
os.makedirs(name, mode=0o777, exist_ok=False)
-
参数:
-
name
:目录路径 -
mode
(可选):权限模式(Unix系统有效) -
exist_ok
:若为True
,目录存在时不报错
-
# 示例:安全创建多级目录
os.makedirs('project/data/images', exist_ok=True)
▶ os.listdir()
- 列出目录内容
os.listdir(path='.')
-
参数:目录路径(默认为当前目录)
-
返回值:文件名列表
# 示例:遍历目录下的文件
for file in os.listdir('data'):if file.endswith('.jpg'):print(f"找到图片文件:{file}")
▶ os.remove()
- 删除文件
os.remove(path)
-
参数:文件路径
# 示例:删除临时文件
if os.path.exists('temp.txt'):os.remove('temp.txt')
3. 环境变量管理
▶ os.environ
- 环境变量字典
# 获取所有环境变量
print(os.environ)# 获取特定变量(如PATH)
path = os.environ.get('PATH', '默认值')
print(f"系统PATH变量:{path}")
▶ os.getenv()
- 安全获取环境变量
os.getenv(key, default=None)
-
参数:
-
key
:变量名 -
default
:变量不存在时的默认值
-
# 示例:获取JAVA_HOME
java_home = os.getenv('JAVA_HOME', '/usr/lib/jvm/default-java')
4. 系统命令执行
▶ os.system()
- 执行Shell命令
os.system(command)
-
参数:字符串形式的命令
-
返回值:命令的退出状态码
# 示例:执行ping命令
ret = os.system('ping -c 4 www.baidu.com') # Linux/macOS
if ret == 0:print("Ping成功!")
▶ os.popen()
- 获取命令输出
os.popen(command, mode='r')
-
参数:
-
command
:Shell命令 -
mode
:读写模式('r'
或'w'
)
-
# 示例:读取命令输出
with os.popen('ipconfig' if os.name == 'nt' else 'ifconfig') as f:print(f.read())
三、实战案例:自动化数据预处理
场景描述
假设我们需要:
-
在
data/raw
目录下存放原始数据 -
在
data/processed
目录存放处理后的数据 -
自动清理临时文件
import os
import shutil# 1. 定义路径
raw_dir = os.path.join('data', 'raw')
processed_dir = os.path.join('data', 'processed')
temp_file = 'temp.tmp'# 2. 创建目录结构
os.makedirs(raw_dir, exist_ok=True)
os.makedirs(processed_dir, exist_ok=True)# 3. 模拟数据处理
with open(temp_file, 'w') as f:f.write("临时数据...")# 4. 移动文件到processed目录
shutil.move(temp_file, os.path.join(processed_dir, 'final_data.txt'))# 5. 验证结果
print(f"原始目录内容:{os.listdir(raw_dir)}")
print(f"处理目录内容:{os.listdir(processed_dir)}")
四、os
vs pathlib
对比
特性 | os +os.path | pathlib (Python 3.4+) |
---|---|---|
设计理念 | 函数式编程 | 面向对象(Path 类) |
路径拼接 | os.path.join(a, b) | Path(a) / b |
方法链 | 不支持 | 支持(如Path().mkdir().touch() ) |
推荐场景 | 旧代码维护 | 新项目开发 |
# pathlib等效示例
from pathlib import Path
Path('data/processed').mkdir(parents=True, exist_ok=True)
五、常见问题解答
Q1:os.path.exists()
和os.path.isfile()
有什么区别?
-
exists()
:检查路径是否存在(文件或目录均可) -
isfile()
:严格检查是否为文件
Q2:如何递归删除目录?
import shutil
shutil.rmtree('directory') # 删除目录及其所有内容
六、总结
通过本文,你应掌握:
-
os
模块的核心API及其参数 -
跨平台路径处理的最佳实践
-
文件/目录操作的完整生命周期管理
-
系统命令执行与环境变量访问
扩展阅读:
-
Python官方文档 - os模块
-
RealPython - 文件系统操作指南