人人都会AI编程

13.4 pathlib 模块:面向对象的路径处理

更新时间:2026-07-12

在 Python 中处理文件路径,过去主要靠 os.path 提供的一系列函数,比如 os.path.join()os.path.exists()os.path.basename()。这种方式虽然管用,但写法不太直观,而且要频繁拼接字符串、嵌套调用。
pathlib 是 Python 3.4 引入的标准库模块,它把“路径”封装成一个对象,让你可以用面向对象的方式操作路径——更符合直觉、代码更短、也更不容易出错。

核心类

  • Path:最常用的类,自动根据你的操作系统返回对应的路径对象(Windows 上返回 WindowsPath,Linux/macOS 上返回 PosixPath)。
  • PurePath / PurePosixPath / PureWindowsPath:纯路径类,不涉及实际文件系统操作,适合做路径计算和格式化。

日常开发中绝大多数场景只需要用 Path 就足够了。

常用操作速览

以下是 pathlib 中最常被用到的方法和属性,掌握它们就能应对 90% 的路径处理需求。

路径创建与拼接

from pathlib import Path

# 创建路径对象
p = Path("/home/user/docs/report.txt")

# 用 / 操作符拼接,不再用 os.path.join()
data_dir = Path("/home/user") / "data" / "2024"   # /home/user/data/2024

路径属性

p = Path("/home/user/docs/report.txt")
p.name          # 'report.txt'        文件名
p.stem          # 'report'            文件名主体(不含后缀)
p.suffix        # '.txt'              文件后缀
p.parent        # Path('/home/user/docs')  父目录
p.parts         # ('/', 'home', 'user', 'docs', 'report.txt')  路径各组分

文件与目录判断

p = Path("/home/user/docs")
p.exists()      # 路径是否存在
p.is_file()     # 是否是文件
p.is_dir()      # 是否是目录

创建与删除

dir_path = Path("/home/user/new_folder")
dir_path.mkdir(parents=True, exist_ok=True)   # 递归创建目录,已存在时不报错

file_path = Path("/home/user/temp.txt")
file_path.unlink(missing_ok=True)             # 删除文件,不存在时不报错

读取与写入文件

content = Path("data.txt").read_text(encoding="utf-8")   # 一次性读取文本
Path("output.txt").write_text("Hello, world!")           # 一次性写入文本

# 读取字节
binary = Path("image.png").read_bytes()

比传统的 open()with 更加精简,适合处理中小型文件。大数据文件仍推荐用 open() 逐行迭代。

遍历目录

folder = Path("/home/user/data")
# 遍历所有 .csv 文件(非递归)
for csv_file in folder.glob("*.csv"):
    print(csv_file)

# 递归遍历所有 .py 文件
for py_file in folder.rglob("*.py"):
    print(py_file)

globrglob 返回的是生成器,可以放心处理海量文件而不必担心内存。

路径运算

p1 = Path("/home/user/docs")
p2 = Path("/home/user/docs/report.txt")
p2.relative_to(p1)           # Path('report.txt')   计算相对路径
p1 / ".." / "downloads"      # 路径拼接支持 ..

对比 os.path:为什么要改用 pathlib

| 操作 | os.path 写法 | pathlib 写法 |
|------|-------------|-------------|
| 路径拼接 | os.path.join(dir, sub, file) | Path(dir) / sub / file |
| 获取父目录 | os.path.dirname(p) | Path(p).parent |
| 读取文件 | 先 open,再 read | Path(p).read_text() |
| 检查存在 | os.path.exists(p) | Path(p).exists() |
| 遍历目录 | glob.glob(".csv") | Path.cwd().glob(".csv") |

可以明显看到:pathlib 把分散的函数调用变成了一条链式而又可读的对象路线,路径拼接直接用 / 操作符,非常自然。

跨平台性

Path 自动适配系统路径分隔符,你写 Path("dir/subdir/file.txt") 就可以在 Windows 和 Linux 上都正确工作。如果需要在 Linux 环境下生成 Windows 路径或反之,可以用 PureWindowsPath / PurePosixPath 做纯表示。

实用示例

一个小脚本:搜索当前目录下所有 .log 文件,读取内容并写入到一个汇总文件。

from pathlib import Path

log_dir = Path("logs")
output = Path("summary.txt")
lines = []

for log_file in log_dir.glob("*.log"):
    lines.append(f"--- {log_file.name} ---")
    lines.extend(log_file.read_text(encoding="utf-8").splitlines())

output.write_text("\n".join(lines), encoding="utf-8")

再比如:在指定目录下创建带日期的子目录并写入日志,常用在自动化任务中。

from pathlib import Path
from datetime import date

today_dir = Path("data") / str(date.today())
today_dir.mkdir(parents=True, exist_ok=True)
(today_dir / "report.csv").write_text("col1,col2\n1,2\n")

小结

pathlib 已经成为了 Python 处理路径的推荐方式。如果你现在还在项目里大段使用 os.path 函数,逐步迁移到 pathlib 会让代码更现代、更易读。官方文档也明确表示,os.path 依然可用,但新代码应该优先使用 pathlib