菜单

Pathlib与Glob

相关源文件

本文档解释了 CPython 中的 Pathlib 模块和 Glob 功能、它们的实现以及它们如何交互。Pathlib 提供了面向对象的路径处理方法,而 Glob 则使用类 Unix shell 的通配符对文件系统路径进行模式匹配。有关通用操作系统文件系统访问的信息,请参阅 操作系统和文件系统访问

Pathlib 模块概述

Pathlib 是一个面向对象的、用于文件系统路径操作的库,它提供了适合不同操作系统语义的路径表示类。它通过 PEP 428 于 Python 3.4 中引入。

该模块将路径类分为两类:

  1. 纯路径 (Pure paths):提供纯粹的计算操作,不进行实际的 I/O。
  2. 具体路径 (Concrete paths):继承自纯路径类,并提供 I/O 操作。

来源: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 模块概述

Glob 模块根据类 Unix shell 的规则查找所有匹配指定模式的路径名。它不执行波浪号展开,但可以处理诸如 *? 以及使用 [] 表示的字符范围等通配符。

来源:Lib/glob.py18-194 Doc/library/glob.rst21-37

Pathlib 和 Glob 的集成

Pathlib 通过几种方法集成了 glob 风格的模式匹配。

集成使用了共同的模式匹配语义,但也存在一些重要的区别。

  1. Pathlib 的模式匹配:

    • 在相对于路径的路径部分上执行。
    • 路径感知匹配,理解路径结构。
    • match() 方法仅匹配文件名。
    • full_match() 方法匹配完整路径。
  2. Glob 模块:

    • 直接处理文件系统路径。
    • 返回绝对路径或相对于当前目录的路径。
    • 默认不匹配隐藏文件(点文件)。

来源:Lib/pathlib/types.py277-291 Lib/glob.py30-99

模式匹配规则

Pathlib 和 Glob 都使用相似的模式匹配语法,并具有以下特殊字符:

模式含义
*匹配零个或多个字符(不包括路径分隔符)。
?匹配除路径分隔符外的任何单个字符。
[...]匹配方括号内的任何字符。
[!...]匹配方括号外的任何字符。
**(当 recursive=True 时) 递归匹配目录。

但是,行为上存在重要的区别:

  1. 隐藏文件:

    • Glob:以 . 开头的文件仅会被同样以 . 开头的模式匹配。
    • Pathlib:默认情况下,* 模式会匹配以 . 开头的文件。
  2. 递归:

    • Glob:要求 recursive=True 才能使 ** 工作。
    • Pathlib:rglob() 等同于启用了递归的 glob('**/')
  3. 路径处理:

    • Glob:使用字符串路径。
    • Pathlib:使用 Path 对象,并返回 Path 对象。

来源:Lib/glob.py226-319 Doc/library/glob.rst21-37 Doc/library/pathlib.rst574-624

实现细节

Pathlib 实现

Pathlib 实现为一个包含多个模块的包:

  1. __init__.py:包含主要的类和功能。
  2. _os.py:低级操作系统功能封装。
  3. types.py:协议和抽象基类。

核心结构使用类层次结构,并包含特定于平台的路径解析器。

关键实现点

  1. 路径解析 (Path Parsing):路径被解析为组件(驱动器、根目录、部分)以进行操作。
  2. 惰性计算 (Lazy Computation):许多属性按需计算并缓存。
  3. 操作系统集成 (OS Integration):使用适当的操作系统模块执行文件系统操作。

来源:Lib/pathlib/__init__.py77-134 Lib/pathlib/_os.py9-21

Glob 实现

Glob 实现为一个单一模块,提供递归模式匹配功能。

关键实现点

  1. 模式识别 (Pattern Recognition):使用正则表达式识别特殊模式字符。
  2. 目录遍历 (Directory Traversal):使用 os.scandir() 进行高效的目录迭代。
  3. 过滤 (Filtering):使用 fnmatch.filter() 将文件名与模式进行匹配。
  4. 递归 (Recursion):对 ** 模式和 recursive=True 进行特殊处理。

来源:Lib/glob.py104-248

使用示例

基本路径操作

使用 Pathlib 进行 Glob 操作

使用 Glob 模块

Pathlib 与直接 Glob 的比较

功能PathlibGlob 模块
返回类型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 的近期和即将进行的更改。

  1. Python 3.13/3.14 增强功能:

    • 对于 suffixsuffixes 的行为已修改,以将单个点 (.) 视为有效后缀。
    • 已弃用 is_reserved() 方法,改为使用 os.path.isreserved()
    • 改进了文档和实现细节。
  2. 集成改进:

    • Pathlib 和 Glob 功能之间更好的集成。
    • 目录遍历性能改进。
    • 对路径遍历边缘情况更一致的处理。

来源:Doc/whatsnew/3.14.rst1-473 Doc/library/pathlib.rst733-734

结论

Pathlib 和 Glob 模块为 Python 中的文件系统路径操作和模式匹配提供了互补的功能。Pathlib 提供了一种面向对象的、功能丰富的路径操作方法,而 Glob 则提供类 Unix shell 的通配符模式匹配。两者结合起来,为文件系统遍历、文件匹配和路径操作提供了强大的工具。

对于大多数现代 Python 应用程序,推荐使用 Pathlib 的面向对象接口,因为它提供了更好的可组合性、平台独立性以及与其他 Python 特性的集成。Glob 模块在简单的脚本或处理需要字符串路径的遗留代码时仍然很有用。