在 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)
glob 和 rglob 返回的是生成器,可以放心处理海量文件而不必担心内存。
路径运算
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。