本文档解释了 CPython 中的 Pathlib 模块和 Glob 功能、它们的实现以及它们如何交互。Pathlib 提供了面向对象的路径处理方法,而 Glob 则使用类 Unix shell 的通配符对文件系统路径进行模式匹配。有关通用操作系统文件系统访问的信息,请参阅 操作系统和文件系统访问。
Pathlib 是一个面向对象的、用于文件系统路径操作的库,它提供了适合不同操作系统语义的路径表示类。它通过 PEP 428 于 Python 3.4 中引入。
该模块将路径类分为两类:
来源:Lib/pathlib/__init__.py78-556 Doc/library/pathlib.rst11-41
纯路径对象提供路径处理操作,而不访问文件系统。当您希望在 Unix 机器上操作 Windows 路径(或反之亦然),或者确保代码不实际访问操作系统时,它们非常有用。
来源:Lib/pathlib/__init__.py78-183 Doc/library/pathlib.rst107-199
具体路径类继承自纯路径类,并添加了用于 I/O 操作的方法,这些方法会与实际文件系统进行交互。
来源:Lib/pathlib/__init__.py768-3114 Doc/library/pathlib.rst760-802
Glob 模块根据类 Unix shell 的规则查找所有匹配指定模式的路径名。它不执行波浪号展开,但可以处理诸如 *、? 以及使用 [] 表示的字符范围等通配符。
来源:Lib/glob.py18-194 Doc/library/glob.rst21-37
Pathlib 通过几种方法集成了 glob 风格的模式匹配。
集成使用了共同的模式匹配语义,但也存在一些重要的区别。
Pathlib 的模式匹配:
match() 方法仅匹配文件名。full_match() 方法匹配完整路径。Glob 模块:
来源:Lib/pathlib/types.py277-291 Lib/glob.py30-99
Pathlib 和 Glob 都使用相似的模式匹配语法,并具有以下特殊字符:
| 模式 | 含义 |
|---|---|
* | 匹配零个或多个字符(不包括路径分隔符)。 |
? | 匹配除路径分隔符外的任何单个字符。 |
[...] | 匹配方括号内的任何字符。 |
[!...] | 匹配方括号外的任何字符。 |
** | (当 recursive=True 时) 递归匹配目录。 |
但是,行为上存在重要的区别:
隐藏文件:
. 开头的文件仅会被同样以 . 开头的模式匹配。* 模式会匹配以 . 开头的文件。递归:
recursive=True 才能使 ** 工作。rglob() 等同于启用了递归的 glob('**/')。路径处理:
来源:Lib/glob.py226-319 Doc/library/glob.rst21-37 Doc/library/pathlib.rst574-624
Pathlib 实现为一个包含多个模块的包:
__init__.py:包含主要的类和功能。_os.py:低级操作系统功能封装。types.py:协议和抽象基类。核心结构使用类层次结构,并包含特定于平台的路径解析器。
关键实现点
来源:Lib/pathlib/__init__.py77-134 Lib/pathlib/_os.py9-21
Glob 实现为一个单一模块,提供递归模式匹配功能。
关键实现点
os.scandir() 进行高效的目录迭代。fnmatch.filter() 将文件名与模式进行匹配。** 模式和 recursive=True 进行特殊处理。| 功能 | Pathlib | Glob 模块 |
|---|---|---|
| 返回类型 | Path 对象 | 字符串 |
| 接口 | 面向对象 | 基于函数 |
| 隐藏文件 | * 匹配点文件。 | 仅当模式以 . 开头时才匹配点文件。 |
| 递归 | rglob() 或 glob('**/') | glob('**/', recursive=True) |
| 路径构建 | 可链式调用 (p / 'subdir' / 'file.txt') | 需要字符串拼接。 |
| 相对路径 | 相对于 Path 对象。 | 相对于当前目录(或指定根目录)。 |
| 文件操作 | 集成式(p.read_text(), p.write_bytes())。 | 独立式(需要使用路径字符串调用 open())。 |
来源:Doc/library/pathlib.rst55-92 Doc/library/glob.rst164-193
Pathlib 和 Glob 的近期和即将进行的更改。
Python 3.13/3.14 增强功能:
suffix 和 suffixes 的行为已修改,以将单个点 (.) 视为有效后缀。is_reserved() 方法,改为使用 os.path.isreserved()。集成改进:
来源:Doc/whatsnew/3.14.rst1-473 Doc/library/pathlib.rst733-734
Pathlib 和 Glob 模块为 Python 中的文件系统路径操作和模式匹配提供了互补的功能。Pathlib 提供了一种面向对象的、功能丰富的路径操作方法,而 Glob 则提供类 Unix shell 的通配符模式匹配。两者结合起来,为文件系统遍历、文件匹配和路径操作提供了强大的工具。
对于大多数现代 Python 应用程序,推荐使用 Pathlib 的面向对象接口,因为它提供了更好的可组合性、平台独立性以及与其他 Python 特性的集成。Glob 模块在简单的脚本或处理需要字符串路径的遗留代码时仍然很有用。