Python os 与 os.path 模块全面指南
os 模块是 Python 中与操作系统交互的核心,用于执行文件系统操作、路径处理、环境变量访问和进程管理等任务。
一、 核心:os.path 路径处理模块
这是 os 模块中使用最频繁的部分。
1. 路径构建与解析
| 函数 |
作用 |
示例与说明 |
os.path.join(path1[, path2, ...]) |
智能地组合多个路径部分。 这是跨平台兼容性的关键。 |
os.path.join('folder', 'sub', 'file.txt') 在 Linux/macOS 返回 folder/sub/file.txt 在 Windows 返回 folder\sub\file.txt |
os.path.abspath(path) |
返回路径的绝对路径。 |
os.path.abspath(‘file.txt’) -> /home/user/file.txt |
os.path.realpath(path) |
返回规范化的绝对路径,解析所有符号链接。 |
比 abspath 更彻底。 |
os.path.relpath(path, start=os.curdir) |
返回相对于 start 目录的相对路径。 |
os.path.relpath(‘/etc’, ‘/’) -> ‘etc’ |
os.path.normpath(path) |
规范化路径,处理多余的 .、.. 和分隔符。 |
os.path.normpath(‘a//b/../c’) -> a/c |
os.path.normcase(path) |
规范化路径的大小写。在 Windows 上会转为小写。 |
|
2. 路径拆分与获取信息
| 函数 |
作用 |
返回结果示例 |
os.path.split(path) |
将路径分割为 (目录路径, 文件名)。 |
split(‘/a/b/c.txt’) -> (‘/a/b’, ‘c.txt’) |
os.path.splitext(path) |
将路径分割为 (根路径, 扩展名)。 |
splitext(‘file.tar.gz’) -> (‘file.tar’, ‘.gz’) |
os.path.dirname(path) |
返回路径中的目录部分(即 split() 的第一部分)。 |
dirname(‘/a/b/c.txt’) -> /a/b |
os.path.basename(path) |
返回路径中的文件名部分(即 split() 的第二部分)。 |
basename(‘/a/b/c.txt’) -> c.txt |
os.path.commonpath(paths) |
返回一个路径列表的公共父路径。 |
|
os.path.commonprefix(paths) |
返回一个字符串列表的最长公共前缀(已弃用,不用于路径)。 |
|
3. 路径检测与属性
| 函数 |
作用 |
os.path.exists(path) |
路径(文件或目录)是否存在。 |
os.path.isfile(path) |
是否是文件。 |
os.path.isdir(path) |
是否是目录。 |
os.path.islink(path) |
是否是符号链接。 |
os.path.isabs(path) |
是否是绝对路径。 |
os.path.samefile(path1, path2) |
两个路径名是否指向同一个文件。 |
os.path.getsize(path) |
返回文件大小(字节)。 |
os.path.getmtime(path) |
返回文件最后修改时间(时间戳)。 |
os.path.getatime(path) |
返回文件最后访问时间。 |
os.path.getctime(path) |
返回文件创建或元数据最后更改时间。 |
二、 文件和目录操作
1. 目录操作
| 函数 |
作用 |
说明 |
os.getcwd() |
返回当前工作目录。 |
|
os.chdir(path) |
改变当前工作目录。 |
|
os.listdir(path=’.’) |
返回指定目录下的文件和子目录名列表。 |
不包括 . 和 ..。 |
os.scandir(path=’.’) |
返回一个包含 DirEntry 对象的迭代器。性能优于 listdir。 |
Python 3.5+,支持 with 语句。 |
os.mkdir(path, mode=0o777) |
创建单级目录。 |
父目录必须存在。 |
os.makedirs(path, mode=0o777, exist_ok=False) |
递归创建目录。 |
exist_ok=True 时,目录存在不报错。 |
os.rmdir(path) |
删除空目录。 |
|
os.removedirs(path) |
递归删除空目录,直到非空目录为止。 |
使用需谨慎。 |
os.walk(top, topdown=True) |
目录树生成器。递归遍历,在每层返回 (当前路径, [子目录列表], [文件列表])。 |
文件系统操作的瑞士军刀。 |
2. 文件操作
| 函数 |
作用 |
os.rename(src, dst) |
重命名或移动文件/目录。 |
os.replace(src, dst) |
原子性地重命名或移动文件(Python 3.3+)。 |
os.remove(path) 或 os.unlink(path) |
删除文件。 |
os.link(src, dst) |
创建指向 src 的硬链接 dst。 |
os.symlink(src, dst, target_is_directory=False) |
创建指向 src 的符号链接 dst。 |
三、 进程与环境管理
1. 环境变量
| 函数/属性 |
作用 |
os.environ |
一个表示环境变量的 dict 对象。修改此字典会影响当前进程环境。 |
os.getenv(key, default=None) |
获取环境变量值。 |
os.putenv(key, value) |
设置环境变量(建议直接操作 os.environ)。 |
os.unsetenv(key) |
删除环境变量。 |
2. 执行系统命令
| 函数 |
作用 |
说明 |
os.system(command) |
在子 shell 中执行命令。返回命令的退出状态码。 |
简单,但功能有限(无法直接获取输出)。 |
os.popen(command, mode=’r’, buffering=-1) |
执行命令并返回一个文件对象,通过它可读取命令输出或向其输入。 |
已被 subprocess 模块取代。 |
四、 其他实用功能
| 函数/属性 |
作用 |
os.name |
操作系统类型:‘posix’(Linux/macOS),‘nt’(Windows),‘java’。 |
os.sep |
操作系统使用的路径分隔符(如 / 或 \)。 |
os.linesep |
当前平台的行终止符(如 \n 或 \r\n)。 |
os.cpu_count() |
返回系统的 CPU 核心数量。 |
os.urandom(size) |
返回由操作系统随机源生成的、适合加密使用的 size 个字节。 |
关键建议
- 路径拼接:永远使用
os.path.join(),避免手动拼接字符串,以确保代码的跨平台兼容性。
- 目录遍历:优先使用
os.scandir(),它在获取文件类型信息时比 os.listdir() 更高效。
- 执行命令:对于复杂的命令交互,使用标准库的
subprocess 模块,它比 os.system 和 os.popen 更强大和安全。
- 检查存在性:
os.path.exists() 存在竞态条件。更稳健的模式是“尝试操作,捕获异常”(EAFP)。