pathlib 是 Python 3.4 引入的标准库,提供了一种面向对象的方式来处理文件系统路径。它用 Path 对象取代了传统的字符串路径操作,使代码更直观、更健壮、更易于维护。

Path 对象的构成

pathlib 模块的核心是 Path 类,它根据运行的操作系统,自动选择 PosixPath (Unix/Linux/macOS) 或 WindowsPath (Windows)。

要理解 Path,首先需要了解其构成。pathlib 将路径分为两种类型:

  • 纯路径 (Pure Paths):只进行字符串计算,不访问文件系统。例如,在 Unix 系统上处理 Windows 路径时非常有用。

  • 具体路径 (Concrete Paths)继承自纯路径,并增加了文件系统 I/O 操作。日常开发中,我们主要使用的 Path 类就属于这一类。

1. 创建 Path 对象

from pathlib import Path

# 从字符串创建
p1 = Path('/home/user/docs/report.txt')

# 从多个部分自动拼接
p2 = Path('home', 'user', 'docs', 'report.txt')

# 获取特殊目录
home = Path.home()          # 用户主目录[reference:15]
cwd = Path.cwd()            # 当前工作目录[reference:16]

2. 路径拼接与解析

Python Pathlib:现代文件路径处理指南 – Kanaries

拼接:使用 / 运算符,比 os.path.join() 更直观且跨平台

p = Path('/home/user') / 'docs' / 'report.txt'

分解:通过属性直接访问路径的各部分

p = Path('/home/user/docs/report.txt')
print(p.parent)      # /home/user/docs
print(p.name)        # report.txt
print(p.stem)        # report (不含扩展名)[reference:21]
print(p.suffix)      # .txt
print(p.parents[0])  # /home/user/docs (父路径)[reference:22]

3.文件系统查询与判断

p = Path('/home/user/docs/report.txt')

p.exists()      # 路径是否存在[reference:23]
p.is_file()     # 是否是文件[reference:24]
p.is_dir()      # 是否是目录[reference:25]
p.stat()        # 获取文件状态信息 (如大小、修改时间)

4. 目录与文件操作

目录操作:

dir_path = Path('new_folder')
dir_path.mkdir(parents=True, exist_ok=True) # 创建目录,自动创建父目录,存在也不报错[reference:26]

文件读写:Path 对象内置了便捷的读写方法

file_path = Path('example.txt')
file_path.write_text('Hello, World!') # 写入文本
content = file_path.read_text()       # 读取文本

遍历目录:

# iterdir(): 遍历当前目录下的所有内容[reference:30]
for item in Path('.').iterdir():
    print(item)

# glob(): 进行模式匹配[reference:31][reference:32]
py_files = list(Path('.').glob('*.py'))        # 当前目录下所有 .py 文件
all_py_files = list(Path('.').rglob('*.py'))   # 递归查找所有 .py 文件[reference:33][reference:34]

注意事项:

  • 性能考量pathlib 是高级封装,相比直接操作字符串的 os.path 可能略慢。但在大多数文件 I/O 场景下,这个性能差异可以忽略不计。在极高频的路径字符串处理(如解析数百万行日志)中,需注意其性能。

  • 路径类型Path 对象的方法(如 open())通常要求路径是字符串。虽然 Path 对象可直接传给需要字符串路径的函数,但若遇到类型错误,可用 str(path) 转换。

  • resolve() 与符号链接p.resolve() 可获取绝对路径并解析符号链接。但在符号链接较多的环境中,频繁调用可能影响性能。

  • 路径规范化pathlib 会自动处理路径中的冗余分隔符和 ..。但需注意,在 Windows 上,对某些特殊长路径的处理可能略有不同。

总结

pathlib 是 Python 处理文件系统路径的现代、推荐方式。它通过面向对象的 Path 对象,将路径操作统一起来,使代码更清晰、更健壮、更易于跨平台。

对于绝大多数文件与路径操作,从 os.path 转向 pathlib 都能显著提升代码质量。建议在新项目中优先使用 pathlib,并逐步在旧项目中重构路径处理相关的代码。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐