pathlib 开始使用 — 面向对象的路径处理

在使用 Python 时,处理文件路径或目录的情况非常常见。这是日常工作,例如保存日志或读取、写入配置文件、整理数据文件等。过去,我们通常使用 os.pathglobshutil 等模块混合处理这些任务,但现在不再需要这样做。为什么呢?

因为有 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 环境下常用的 cdlsmkdir 类似的语法结构更为熟悉。

为什么应该使用 pathlib?

  • 使用 Path 对象 而不是字符串,使代码结构更加清晰。
  • 操作系统无关的路径处理(Windows vs POSIX)
  • os.pathglobshutil 的功能整合成一个
  • 在测试代码、记录、错误处理等方面也 提高了可维护性

Tux assembling file path blocks in a Python T-shirt

总结

Counterdefaultdict 使集合的处理更加优雅,同样,pathlib 彻底改变了处理文件路径的方式。过去依靠字符串处理的艰辛日子可以遗忘了。请逐一执行本文中展示的示例,您会发现学习起来比想象中要快得多。

在下一篇文章中,我们将讨论如何通过 shutil 自动化实际文件的复制/备份的高级用法,敬请期待!

如果想知道上一篇文章,可以点击下面链接进行查看。

Python 标准库 1 - collections.Counter

Python 标准库 2 - collections.defaultdict