pathlib 开始使用 — 面向对象的路径处理
在使用 Python 时,处理文件路径或目录的情况非常常见。这是日常工作,例如保存日志或读取、写入配置文件、整理数据文件等。过去,我们通常使用 os.path
、glob
、shutil
等模块混合处理这些任务,但现在不再需要这样做。为什么呢?
因为有 pathlib
。
pathlib 是什么?
pathlib
是从 Python 3.4 开始出现的 专门用于路径处理的面向对象模块。以前我们将文件路径简单地视为字符串,而 pathlib
将“路径本身”视为一个对象。因此,连接路径、检查存在性以及读取和写入文件等操作都变得更加 清晰易读。
from pathlib import Path
▶ 这个 Path
类会自动根据您的操作系统转变为 PosixPath
(macOS/Linux)或 WindowsPath
。无论您使用什么操作系统,都不必担心这一点!
pathlib 的必备功能与示例
1. 创建路径对象
p = Path('data/example.txt')
print(p.resolve()) # 返回绝对路径
虽然看起来像字符串,但其实这是一个对象。通过各种方法和属性,可以灵活地处理路径。
2. 路径连接:使用 /
运算符
data_dir = Path('data')
file_path = data_dir / 'sample.txt'
使用斜杠运算符 /
连接路径的方式非常 Pythonic。比起字符串拼接,阅读性和稳定性更高。
3. 提取路径信息
拆分出父目录、名称、扩展名等路径组成部分,这点也很方便。
p = Path('data/sample.txt')
print(p.parent) # data
print(p.name) # sample.txt
print(p.stem) # sample
print(p.suffix) # .txt
4. 检查存在性
结果返回布尔值。
p.exists() # 检查是否存在
p.is_file() # 是否是文件?
p.is_dir() # 是否是目录?
5. 创建目录
p = Path('logs/2025/05')
p.mkdir(parents=True, exist_ok=True)
可以一次性创建嵌套目录,即使已存在也不会报错。
6. 读写文件
p = Path('output.txt')
p.write_text("Hello, World!")
text = p.read_text()
print(text)
也可以处理二进制文件:
p.write_bytes(b'binary data')
data = p.read_bytes()
7. 文件/目录搜索
print(list(Path('.').glob('*.py'))) # 当前文件夹的 .py 文件列表
print(list(Path('.').rglob('*.py'))) # 递归搜索子文件夹
glob()
返回生成器,因此将其转换为列表进行查看是比较好的方式。
8. 删除、移动、重命名文件
p.unlink() # 删除
p.rename('newname') # 重命名(在同一目录内)
p.replace('newpath') # 移动并覆盖
rename()
可能会因为目标路径存在而失败,因此需要覆盖时请使用replace()
。复制工作需要使用shutil.copy()
。
os.path vs pathlib 比较
# os.path
import os
os.path.exists('foo/bar.txt')
# pathlib
Path('foo/bar.txt').exists()
- 代码更易读,阅读性也更好。
- 特别是与在 Linux 环境下常用的
cd
、ls
、mkdir
类似的语法结构更为熟悉。
为什么应该使用 pathlib?
- 使用 Path 对象 而不是字符串,使代码结构更加清晰。
- 操作系统无关的路径处理(Windows vs POSIX)
- 将
os.path
、glob
、shutil
的功能整合成一个 - 在测试代码、记录、错误处理等方面也 提高了可维护性
总结
Counter
和 defaultdict
使集合的处理更加优雅,同样,pathlib
彻底改变了处理文件路径的方式。过去依靠字符串处理的艰辛日子可以遗忘了。请逐一执行本文中展示的示例,您会发现学习起来比想象中要快得多。
在下一篇文章中,我们将讨论如何通过 shutil
自动化实际文件的复制/备份的高级用法,敬请期待!
如果想知道上一篇文章,可以点击下面链接进行查看。
댓글이 없습니다.