pathlib是Python标准库中用于表示与操作文件系统路径的模块,以类而非字符串的形式组织路径操作。它提供纯路径(PurePath)与实体路径(Path)两类对象,前者只做与输入输出无关的路径计算,后者继承纯路径并额外提供访问文件系统的能力。该模块随Python 3.4加入标准库,来源为PEP 428提案,与既有的os.path模块并存,是Python中处理路径的常用方式之一。
定义
pathlib是Python标准库中提供文件系统路径类的模块,这些类能够适配不同操作系统的路径语义,并按照平台选择相应的路径风格[1]。模块的类沿两个方向划分:一类是纯路径(pure path),只做不涉及输入输出的计算;另一类是实体路径(concrete path),继承自纯路径,另外还提供执行系统调用的方法[2]。
对于不确定该选用哪个类的使用者,通常需要的是Path,它在实例化时按程序运行所在的平台生成一个实体路径对象;PurePosixPath与PureWindowsPath这类纯路径则不会触碰操作系统[2]。文档同时说明,若只需在字符串层面做底层的路径操作,也可以使用os.path模块[2]。
原理
pathlib的类层次沿纯路径与实体路径、Windows风格与POSIX风格两个维度展开。PurePath是依赖系统的工厂,会按运行平台实例化PurePosixPath或PureWindowsPath;Path同样充当工厂,生成PosixPath或WindowsPath[3]。任何纯路径类都能在任意系统上实例化,而实体路径类只能在与之匹配的系统上实例化,因为在风格不兼容的路径上执行系统调用可能引发错误或程序异常[2]。
路径对象是不可变的,因而可被哈希,相同风格的路径之间可以比较和排序,比较时遵循该风格的大小写规则,例如Windows路径的比较不区分大小写[4]。构造时多余的路径分隔符与「.」组件会被消除,「..」组件则不被消除;多个参数传入时会自动拼接,锚定路径的语义与os.path.join类似[5]。
路径对象用斜杠运算符派生子路径,例如把PurePosixPath('foo')与字符串'bar'相除会得到PurePosixPath('foo/bar'),也提供行为相同的joinpath()方法[6]。文档还指出,路径类刻意不继承内置的字符串类型,目的是避免路径对象与非路径字符串发生意外运算,如果希望路径表现为序列,需要查看专门的parts属性[3]。
发展历程
pathlib由PEP 428提案引入,提案名为「pathlib模块——面向对象的文件系统路径」,作者为Antoine Pitrou[7]。该模块随Python 3.4进入标准库并被列为主要新特性之一[8]。提案把使用专门类表示路径的理由,类比为用datetime对象处理日期时间的做法,并指出部分os.path函数因向后兼容而保留了容易混淆的行为,例如abspath()在未先解析符号链接的情况下就简化「..」组件[3]。
此后模块持续扩充。Path.walk()在3.12版加入,用于自上而下或自下而上遍历目录树。glob()与rglob()在3.12版加入case_sensitive参数,在3.13版加入recurse_symlinks参数并允许模式接受路径类对象。3.13版还改变了以「**」结尾的模式的匹配结果,此前只返回目录,此后文件与目录都会返回[9]。
应用
在文件系统操作方面,实体路径提供了跨平台的方法集合,涵盖读取当前工作目录、用户主目录、文件状态、权限修改、存在性判断、文件类型判断、目录列举、文件打开与删除等操作[10]。例如Path.cwd()返回当前目录对应的路径对象,Path.home()返回用户主目录对应的路径对象,Path.stat()返回与os.stat()类似的信息。
查询方面,exists()判断路径是否指向已存在的文件或目录,is_dir()与is_file()分别判断是否为目录或普通文件,这些方法在路径不存在或为断开符号链接时返回False,其他错误如权限错误则继续传播[11]。从3.8版起,这些判断方法对包含操作系统层面无法表示字符的路径改为返回False,而不是抛出异常。
检索方面,glob()按相对模式在目录中匹配文件,模式中使用「」表示递归进入当前目录及其所有子目录,rglob()等价于在模式前加上「/」进行递归匹配[11][12]。模式语言支持「**」「*」「?」以及字符区间等通配符,其中以点开头的文件在pathlib中并不特殊,这一点与glob模块的行为不同[9]。
路径还能在字符串与URI之间转换:对路径调用str()得到原始的文件系统路径,as_posix()强制使用正斜杠,as_uri()生成file:形式的URI,from_uri()则从file:URI解析出路径对象[5][12]。路径对象可以直接用在接受os.PathLike接口的地方,其字符串形式也可以传给任何以文件路径字符串为参数的函数[4]。
局限
纯路径与实体路径的划分带来了使用限制。纯路径类不提供任何访问文件系统的方法,因此想要判断路径是否存在必须使用实体路径类,而实体路径类只能在与其风格匹配的系统上实例化,在Unix上实例化WindowsPath会失败[2]。
性能方面,文档提示在大型目录树中使用「**」通配符做匹配会访问树中的每一个目录,搜索可能耗费大量时间[11]。实体路径的不少方法在系统调用失败时会抛出OSError,例如路径不存在的情况[2]。
glob()与rglob()的结果与glob模块存在若干差异:pathlib返回的值可能包含路径本身,而glob.glob(root_dir=path)的结果永远不会包含对应路径的空字符串;pathlib中「**」模式组件默认不跟随符号链接,glob模块中没有等价行为[9]。此外,模式匹配默认使用平台相关的大小写规则,通常POSIX上区分大小写、Windows上不区分,需要显式设置case_sensitive才能覆盖。
PurePath的路径解析是纯词法操作,因此不会处理「..」的含义,文档建议在需要沿文件系统向上遍历时先调用Path.resolve(),由它解析符号链接并消去「..」部分[1]。
参见
参考资料
- pathlib --- 面向对象的文件系统路径 [引用日期2026-10-14]
- pathlib --- 物件導向檔案系統路徑¶ - 在 3.13 版的變更: 如果 [引用日期2026-10-14]
- PEP 428 – pathlib 模块 – 面向对象的文件系统路径 [引用日期2026-10-14]
- pathlib [引用日期2026-10-14]
- readthedocs.io 上的网页 [引用日期2026-10-14]
- PEP: 428 [引用日期2026-10-14]
- python.org 上的网页 [引用日期2026-10-14]
- Python Release Python 3.4.8rc1 [引用日期2026-10-14]
- pathlib [引用日期2026-10-14]
- pathlib [引用日期2026-10-14]
- pathlib [引用日期2026-10-14]
- pathlib [引用日期2026-10-14]