Using pathlib module in Python3
在 Python 中,pathlib
模块(从 Python 3.4 开始引入)是对传统 os.path
模块的面向对象封装,它提供了更简洁、直观和现代的方式来处理文件路径和目录操作。相比 os.path
,pathlib
不仅语法更优雅,而且在某些场景下也具有更高的效率和更好的可读性。
官网文档: pathlib
✅ 一、pathlib
的高效方法总结
以下是一些 pathlib.Path
类中常用且效率较高的方法:
方法/属性 | 功能说明 | 效率优势 |
---|---|---|
Path.exists() |
判断路径是否存在 | 更直观,替代 os.path.exists() |
Path.is_file() |
判断是否是文件 | 替代 os.path.isfile() ,无需拼接路径字符串 |
Path.is_dir() |
判断是否是目录 | 替代 os.path.isdir() |
Path.glob(pattern) / Path.rglob(pattern) |
查找匹配的文件(递归) | 替代 glob.glob() 和 os.walk() ,更灵活 |
Path.iterdir() |
遍历目录下的所有文件和子目录 | 替代 os.listdir() ,返回 Path 对象,便于链式调用 |
Path.read_text(encoding=...) |
读取文本文件内容 | 封装了 open/read/close,简单安全 |
Path.write_text(data, encoding=...) |
写入文本文件 | 同上,自动管理资源 |
Path.mkdir(parents=True, exist_ok=True) |
创建多层目录 | 替代 os.makedirs(..., exist_ok=True) ,更简洁 |
Path.resolve() |
返回绝对路径并解析符号链接 | 替代 os.path.abspath() + os.path.realpath() |
Path.with_suffix() / Path.with_name() |
修改文件名或后缀 | 非常方便,避免手动字符串拼接 |
✅ 二、与 os.path
的对比
功能 | os.path 方式 |
pathlib 方式 |
优势说明 |
---|---|---|---|
拼接路径 | os.path.join('a', 'b') |
Path('a') / 'b' |
使用 / 运算符更直观 |
获取父目录 | os.path.dirname(path) |
Path(path).parent |
属性访问更简洁 |
文件扩展名 | os.path.splitext(path)[1] |
Path(path).suffix |
更语义化 |
路径是否存在 | os.path.exists(path) |
Path(path).exists() |
更 OOP,代码结构清晰 |
遍历目录 | os.listdir(path) |
Path(path).iterdir() |
返回 Path 对象,易于进一步操作 |
递归查找 | os.walk() |
Path.glob('**/*') 或 rglob() |
更简洁易读 |
读写文件 | open(path, 'r').read() |
Path.read_text() / write_text() |
更简洁安全,自动关闭文件 |
✅ 三、为什么 pathlib
效率更高?
- 面向对象设计:路径作为对象来处理,可以链式调用多个方法。
- 减少字符串操作:避免手动拼接路径,提高安全性与可维护性。
- 内置方法丰富:许多功能无需额外导入模块(如
glob
,os
等)。 - 跨平台兼容性强:自动适配 Windows、Linux、macOS 的路径格式。
- 性能不输 os.path:底层实现基于
os
,但逻辑更清晰,实际性能相当甚至更优(尤其在大量文件操作时)。
✅ 四、示例对比
示例 1:遍历一个目录中的 .txt
文件
os.path
版本:1
2
3
4
5
6import os
for filename in os.listdir('mydir'):
path = os.path.join('mydir', filename)
if os.path.isfile(path) and path.endswith('.txt'):
print(path)pathlib
版本:1
2
3
4
5from pathlib import Path
for file in Path('mydir').iterdir():
if file.is_file() and file.suffix == '.txt':
print(file)
示例 2:递归查找所有 .py
文件
os.path
+os.walk()
:1
2
3
4
5
6import os
for root, dirs, files in os.walk('.'):
for file in files:
if file.endswith('.py'):
print(os.path.join(root, file))pathlib
:1
2
3
4from pathlib import Path
for file in Path('.').rglob('*.py'):
print(file)
✅ 五、建议使用场景
场景 | 推荐方式 |
---|---|
新项目开发 | 🟢 pathlib (推荐) |
维护旧代码 | 🔵 可继续使用 os.path ,逐步迁移到 pathlib |
高频路径操作 | 🟢 pathlib 更清晰、不易出错 |
简单脚本 | 🔵 根据习惯选择,两者皆可 |
✅ 六、总结
对比维度 | os.path |
pathlib |
---|---|---|
风格 | 函数式 | 面向对象 |
可读性 | 一般 | 好 |
易用性 | 较低 | 高 |
性能 | 相当 | 相当 |
推荐程度 | ❌ 已逐渐淘汰 | ✅ 官方推荐新代码使用 |
如果你正在写新的 Python 代码,强烈建议使用 pathlib
,它不仅更现代、更易维护,而且很多库也开始原生支持 Path
对象(如 shutil
, json
, pandas
等),未来趋势明显。