pathlib —- 面向对象的文件系统路径
3.4 新版功能.

源代码 Lib/pathlib.py
该模块提供表示文件系统路径的类,其语义适用于不同的操作系统。路径类被分为提供纯计算操作而没有 I/O 的 纯路径,以及从纯路径继承而来但提供 I/O 操作的 具体路径。
如果以前从未用过此模块,或不确定哪个类适合完成任务,那要用的可能就是 Path。它在运行代码的平台上实例化为 具体路径。
在一些用例中纯路径很有用,例如:
-
如果你想要在 Unix 设备上操作 Windows 路径(或者相反)。你不应在 Unix 上实例化一个 WindowsPath,但是你可以实例化 PureWindowsPath。
-
你只想操作路径但不想实际访问操作系统。在这种情况下,实例化一个纯路径是有用的,因为它们没有任何访问操作系统的操作。
参见
PEP 428:pathlib 模块 — 面向对象的文件系统路径。
参见
对于底层的路径字符串操作,你也可以使用 os.path 模块。
基础使用
导入主类:
>>> from pathlib import Path
列出子目录:
>>> p = Path('.')>>> [x for x in p.iterdir() if x.is_dir()][PosixPath('.hg'), PosixPath('docs'), PosixPath('dist'),PosixPath('__pycache__'), PosixPath('build')]
列出当前目录树下的所有 python 源代码文件:
>>> list(p.glob('**/*.py'))[PosixPath('test_pathlib.py'), PosixPath('setup.py'),PosixPath('pathlib.py'), PosixPath('docs/conf.py'),PosixPath('build/lib/pathlib.py')]
在目录树中移动:
>>> p = Path('/etc')>>> q = p / 'init.d' / 'reboot'>>> qPosixPath('/etc/init.d/reboot')>>> q.resolve()PosixPath('/etc/rc.d/init.d/halt')
查询路径的属性:
>>> q.exists()True>>> q.is_dir()False
打开一个文件:
>>> with q.open() as f: f.readline()...'#!/bin/bash\n'
纯路径
纯路径对象提供了不实际访问文件系统的路径处理操作。有三种方式来访问这些类,也是不同的风格:
class pathlib.PurePath(\pathsegments*)
一个通用的类,代表当前系统的路径风格(实例化为 PurePosixPath 或者 PureWindowsPath):
>>> PurePath('setup.py') # Running on a Unix machinePurePosixPath('setup.py')
每一个 pathsegments 的元素可能是一个代表路径片段的字符串,一个返回字符串的实现了 os.PathLike 接口的对象,或者另一个路径对象:
>>> PurePath('foo', 'some/path', 'bar')PurePosixPath('foo/some/path/bar')>>> PurePath(Path('foo'), Path('bar'))PurePosixPath('foo/bar')
当 pathsegments 为空的时候,假定为当前目录:
>>> PurePath()PurePosixPath('.')
当给出一些绝对路径,最后一位将被当作锚(模仿 os.path.join() 的行为):
>>> PurePath('/etc', '/usr', 'lib64')PurePosixPath('/usr/lib64')>>> PureWindowsPath('c:/Windows', 'd:bar')PureWindowsPath('d:bar')
但是,在 Windows 路径中,改变本地根目录并不会丢弃之前盘符的设置:
>>> PureWindowsPath('c:/Windows', '/Program Files')PureWindowsPath('c:/Program Files')
假斜杠和单个点号会被消除,但双点号 ('..') 和打头的双斜杠 ('//') 不会,因为这会出于各种原因改变路径的实际含义 (例如符号链接、UNC 路径等):
>>> PurePath('foo//bar')PurePosixPath('foo/bar')>>> PurePath('//foo/bar')PurePosixPath('//foo/bar')>>> PurePath('foo/./bar')PurePosixPath('foo/bar')>>> PurePath('foo/../bar')PurePosixPath('foo/../bar')
(一个很 naïve 的做法是让 PurePosixPath('foo/../bar') 等同于 PurePosixPath('bar'),如果 foo 是一个指向其他目录的符号链接那么这个做法就将出错)
纯路径对象实现了 os.PathLike 接口,允许它们在任何接受此接口的地方使用。
在 3.6 版更改: 添加了 os.PathLike 接口支持。
class pathlib.PurePosixPath(\pathsegments*)
一个 PurePath 的子类,路径风格不同于 Windows 文件系统:
>>> PurePosixPath('/etc')PurePosixPath('/etc')
pathsegments 参数的指定和 PurePath 相同。
class pathlib.PureWindowsPath(\pathsegments*)
PurePath 的一个子类,此路径风格代表 Windows 文件系统路径,包括 UNC paths#UNC):
>>> PureWindowsPath('c:/Program Files/')PureWindowsPath('c:/Program Files')>>> PureWindowsPath('//server/share/file')PureWindowsPath('//server/share/file')
pathsegments 参数的指定和 PurePath 相同。
无论你正运行什么系统,你都可以实例化这些类,因为它们提供的操作不做任何系统调用。
通用性质
路径是不可变并可哈希的。相同风格的路径可以排序与比较。这些性质尊重对应风格的大小写转换语义:
>>> PurePosixPath('foo') == PurePosixPath('FOO')False>>> PureWindowsPath('foo') == PureWindowsPath('FOO')True>>> PureWindowsPath('FOO') in { PureWindowsPath('foo') }True>>> PureWindowsPath('C:') < PureWindowsPath('d:')True
不同风格的路径比较得到不等的结果并且无法被排序:
>>> PureWindowsPath('foo') == PurePosixPath('foo')False>>> PureWindowsPath('foo') < PurePosixPath('foo')Traceback (most recent call last):File "", line 1, in TypeError: '<' not supported between instances of 'PureWindowsPath' and 'PurePosixPath'
运算符
斜杠 / 操作符有助于创建子路径,就像 os.path.join() 一样:
>>> p = PurePath('/etc')>>> pPurePosixPath('/etc')>>> p / 'init.d' / 'apache2'PurePosixPath('/etc/init.d/apache2')>>> q = PurePath('bin')>>> '/usr' / qPurePosixPath('/usr/bin')
文件对象可用于任何接受 os.PathLike 接口实现的地方。
>>> import os>>> p = PurePath('/etc')>>> os.fspath(p)'/etc'
路径的字符串表示法为它自己原始的文件系统路径(以原生形式,例如在 Windows 下使用反斜杠)。你可以传递给任何需要字符串形式路径的函数。
>>> p = PurePath('/etc')>>> str(p)'/etc'>>> p = PureWindowsPath('c:/Program Files')>>> str(p)'c:\\Program Files'
类似地,在路径上调用 bytes 将原始文件系统路径作为字节对象给出,就像被 os.fsencode() 编码一样:
>>> bytes(p)b'/etc'
备注
只推荐在 Unix 下调用 bytes。在 Windows, unicode 形式是文件系统路径的规范表示法。
访问个别部分
为了访问路径独立的部分 (组件),使用以下特征属性:
PurePath.parts
一个元组,可以访问路径的多个组件:
>>> p = PurePath('/usr/bin/Python3')>>> p.parts('/', 'usr', 'bin', 'python3')>>> p = PureWindowsPath('c:/Program Files/PSF')>>> p.parts('c:\\', 'Program Files', 'PSF')
(注意盘符和本地根目录是如何重组的)
方法和特征属性
纯路径提供以下方法和特征属性:
PurePath.drive
一个表示驱动器盘符或命名的字符串,如果存在:
>>> PureWindowsPath('c:/Program Files/').drive'c:'>>> PureWindowsPath('/Program Files/').drive''>>> PurePosixPath('/etc').drive''
UNC 分享也被认作驱动器:
>>> PureWindowsPath('//host/share/foo.txt').drive'\\\\host\\share'
PurePath.root
一个表示(本地或全局)根的字符串,如果存在:
>>> PureWindowsPath('c:/Program Files/').root'\\'>>> PureWindowsPath('c:Program Files/').root''>>> PurePosixPath('/etc').root'/'
UNC 分享一样拥有根:
>>> PureWindowsPath('//host/share').root'\\'
如果路径以超过两个连续斜框打头,PurePosixPath 会合并它们:
>>> PurePosixPath('//etc').root'//'>>> PurePosixPath('///etc').root'/'>>> PurePosixPath('////etc').root'/'
备注
This behavior conforms to The Open Group Base Specifications Issue 6, paragraph 4.11 Pathname Resolution:
“以连续两个斜杠打头的路径名可能会以具体实现所定义的方式被解读,但是两个以上的前缀斜杠则应当被当作一个斜杠来处理。”
PurePath.anchor
驱动器和根的联合:
>>> PureWindowsPath('c:/Program Files/').anchor'c:\\'>>> PureWindowsPath('c:Program Files/').anchor'c:'>>> PurePosixPath('/etc').anchor'/'>>> PureWindowsPath('//host/share').anchor'\\\\host\\share\\'
PurePath.parents
提供访问此路径的逻辑祖先的不可变序列:
>>> p = PureWindowsPath('c:/foo/bar/setup.py')>>> p.parents[0]PureWindowsPath('c:/foo/bar')>>> p.parents[1]PureWindowsPath('c:/foo')>>> p.parents[2]PureWindowsPath('c:/')
在 3.10 版更改: parents 序列现在支持 切片 和负的索引值。
PurePath.parent
此路径的逻辑父路径:
>>> p = PurePosixPath('/a/b/c/d')>>> p.parentPurePosixPath('/a/b/c')
你不能超过一个 anchor 或空路径:
>>> p = PurePosixPath('/')>>> p.parentPurePosixPath('/')>>> p = PurePosixPath('.')>>> p.parentPurePosixPath('.')
备注
这是一个单纯的词法操作,因此有以下行为:
>>> p = PurePosixPath('foo/..')>>> p.parentPurePosixPath('foo')
If you want to walk an arbitrary filesystem path upwards, it is recommended to first call Path.resolve() so as to resolve symlinks and eliminate ".." components.
PurePath.name
一个表示最后路径组件的字符串,排除了驱动器与根目录,如果存在的话:
>>> PurePosixPath('my/library/setup.py').name'setup.py'
UNC 驱动器名不被考虑:
>>> PureWindowsPath('//some/share/setup.py').name'setup.py'>>> PureWindowsPath('//some/share').name''
PurePath.suffix
最后一个组件的文件扩展名,如果存在:
>>> PurePosixPath('my/library/setup.py').suffix'.py'>>> PurePosixPath('my/library.tar.gz').suffix'.gz'>>> PurePosixPath('my/library').suffix''
PurePath.suffixes
路径的文件扩展名列表:
>>> PurePosixPath('my/library.tar.gar').suffixes['.tar', '.gar']>>> PurePosixPath('my/library.tar.gz').suffixes['.tar', '.gz']>>> PurePosixPath('my/library').suffixes[]
PurePath.stem
最后一个路径组件,除去后缀:
>>> PurePosixPath('my/library.tar.gz').stem'library.tar'>>> PurePosixPath('my/library.tar').stem'library'>>> PurePosixPath('my/library').stem'library'
PurePath.as_posix()
返回使用正斜杠(/)的路径字符串:
>>> p = PureWindowsPath('c:\\windows')>>> str(p)'c:\\windows'>>> p.as_posix()'c:/windows'
PurePath.as_uri()
将路径表示为 file URL。如果并非绝对路径,抛出 ValueError。
>>> p = PurePosixPath('/etc/passwd')>>> p.as_uri()'file:///etc/passwd'>>> p = PureWindowsPath('c:/Windows')>>> p.as_uri()'file:///c:/Windows'
PurePath.is_absolute()
返回此路径是否为绝对路径。如果路径同时拥有驱动器符与根路径(如果风格允许)则将被认作绝对路径。
>>> PurePosixPath('/a/b').is_absolute()True>>> PurePosixPath('a/b').is_absolute()False>>> PureWindowsPath('c:/a/b').is_absolute()True>>> PureWindowsPath('/a/b').is_absolute()False>>> PureWindowsPath('c:').is_absolute()False>>> PureWindowsPath('//some/share').is_absolute()True
PurePath.is_relative_to(\other*)
返回此路径是否相对于 other 的路径。
>>> p = PurePath('/etc/passwd')>>> p.is_relative_to('/etc')True>>> p.is_relative_to('/usr')False
3.9 新版功能.
PurePath.is_reserved()
在 PureWindowsPath,如果路径是被 Windows 保留的则返回 True,否则 False。在 PurePosixPath,总是返回 False。
>>> PureWindowsPath('nul').is_reserved()True>>> PurePosixPath('nul').is_reserved()False
当保留路径上的文件系统被调用,则可能出现玄学失败或者意料之外的效应。
PurePath.joinpath(\other*)
调用此方法等同于将每个 other 参数中的项目连接在一起:
>>> PurePosixPath('/etc').joinpath('passwd')PurePosixPath('/etc/passwd')>>> PurePosixPath('/etc').joinpath(PurePosixPath('passwd'))PurePosixPath('/etc/passwd')>>> PurePosixPath('/etc').joinpath('init.d', 'apache2')PurePosixPath('/etc/init.d/apache2')>>> PureWindowsPath('c:').joinpath('/Program Files')PureWindowsPath('c:/Program Files')
PurePath.match(pattern)
将此路径与提供的通配符风格的模式匹配。如果匹配成功则返回 True,否则返回 False。
如果 pattern 是相对的,则路径可以是相对路径或绝对路径,并且匹配是从右侧完成的:
>>> PurePath('a/b.py').match('*.py')True>>> PurePath('/a/b/c.py').match('b/*.py')True>>> PurePath('/a/b/c.py').match('a/*.py')False
如果 pattern 是绝对的,则路径必须是绝对的,并且路径必须完全匹配:
>>> PurePath('/a.py').match('/*.py')True>>> PurePath('a/b.py').match('/*.py')False
与其他方法一样,是否大小写敏感遵循平台的默认规则:
>>> PurePosixPath('b.py').match('*.PY')False>>> PureWindowsPath('b.py').match('*.PY')True
PurePath.relative_to(\other*)
计算此路径相对 other 表示路径的版本。如果不可计算,则抛出 ValueError:
>>> p = PurePosixPath('/etc/passwd')>>> p.relative_to('/')PurePosixPath('etc/passwd')>>> p.relative_to('/etc')PurePosixPath('passwd')>>> p.relative_to('/usr')Traceback (most recent call last):File "", line 1, in File "pathlib.py", line 694, in relative_to.format(str(self), str(formatted)))ValueError: '/etc/passwd' is not in the subpath of '/usr' OR one path is relative and the other absolute.
注意:此函数是 PurePath 的一部分并且适用于字符串。 它不会检查或访问下层的文件结构。
PurePath.with_name(name)
返回一个新的路径并修改 name。如果原本路径没有 name,ValueError 被抛出:
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')>>> p.with_name('setup.py')PureWindowsPath('c:/Downloads/setup.py')>>> p = PureWindowsPath('c:/')>>> p.with_name('setup.py')Traceback (most recent call last):File "", line 1, in File "/home/antoine/cpython/default/Lib/pathlib.py", line 751, in with_nameraise ValueError("%r has an empty name" % (self,))ValueError: PureWindowsPath('c:/') has an empty name
PurePath.with_stem(stem)
返回一个带有修改后 stem 的新路径。 如果原路径没有名称,则会引发 ValueError:
>>> p = PureWindowsPath('c:/Downloads/draft.txt')>>> p.with_stem('final')PureWindowsPath('c:/Downloads/final.txt')>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')>>> p.with_stem('lib')PureWindowsPath('c:/Downloads/lib.gz')>>> p = PureWindowsPath('c:/')>>> p.with_stem('')Traceback (most recent call last):File "", line 1, in File "/home/antoine/cpython/default/Lib/pathlib.py", line 861, in with_stemreturn self.with_name(stem + self.suffix)File "/home/antoine/cpython/default/Lib/pathlib.py", line 851, in with_nameraise ValueError("%r has an empty name" % (self,))ValueError: PureWindowsPath('c:/') has an empty name
3.9 新版功能.
PurePath.with_suffix(suffix)
返回一个新的路径并修改 suffix。如果原本的路径没有后缀,新的 suffix 则被追加以代替。如果 suffix 是空字符串,则原本的后缀被移除:
>>> p = PureWindowsPath('c:/Downloads/pathlib.tar.gz')>>> p.with_suffix('.bz2')PureWindowsPath('c:/Downloads/pathlib.tar.bz2')>>> p = PureWindowsPath('README')>>> p.with_suffix('.txt')PureWindowsPath('README.txt')>>> p = PureWindowsPath('README.txt')>>> p.with_suffix('')PureWindowsPath('README')
具体路径
具体路径是纯路径的子类。除了后者提供的操作之外,它们还提供了对路径对象进行系统调用的方法。有三种方法可以实例化具体路径:
class pathlib.Path(\pathsegments*)
一个 PurePath 的子类,此类以当前系统的路径风格表示路径(实例化为 PosixPath 或 WindowsPath):
>>> Path('setup.py')PosixPath('setup.py')
pathsegments 参数的指定和 PurePath 相同。
class pathlib.PosixPath(\pathsegments*)
一个 Path 和 PurePosixPath 的子类,此类表示一个非 Windows 文件系统的具体路径:
>>> PosixPath('/etc')PosixPath('/etc')
pathsegments 参数的指定和 PurePath 相同。
class pathlib.WindowsPath(\pathsegments*)
Path 和 PureWindowsPath 的子类,从类表示一个 Windows 文件系统的具体路径:
>>> WindowsPath('c:/Program Files/')WindowsPath('c:/Program Files')
pathsegments 参数的指定和 PurePath 相同。
你只能实例化与当前系统风格相同的类(允许系统调用作用于不兼容的路径风格可能在应用程序中导致缺陷或失败):
>>> import os>>> os.name'posix'>>> Path('setup.py')PosixPath('setup.py')>>> PosixPath('setup.py')PosixPath('setup.py')>>> WindowsPath('setup.py')Traceback (most recent call last):File "", line 1, in File "pathlib.py", line 798, in __new__% (cls.__name__,))NotImplementedError: cannot instantiate 'WindowsPath' on your system
方法
除纯路径方法外,实体路径还提供以下方法。 如果系统调用失败(例如因为路径不存在)这些方法中许多都会引发 OSError。
在 3.8 版更改: 对于包含 OS 层级无法表示字符的路径,exists(), is_dir(), is_file(), is_mount(), is_symlink(), is_block_device(), is_char_device(), is_fifo(), is_socket() 现在将返回 False 而不是引发异常。
classmethod Path.cwd()
返回一个新的表示当前目录的路径对象(和 os.getcwd() 返回的相同):
>>> Path.cwd()PosixPath('/home/antoine/pathlib')
classmethod Path.home()
返回一个表示用户家目录的新路径对象(与带 ~ 构造的 os.path.expanduser() 所返回的相同)。 如果无法解析家目录,则会引发 RuntimeError。
>>> Path.home()PosixPath('/home/antoine')
3.5 新版功能.
Path.stat(**, follow_symlinks=True*)
返回一个 os.stat_result 对象,其中包含有关此路径的信息,例如 os.stat()。 结果会在每次调用此方法时重新搜索。
此方法通常会跟随符号链接;要对 symlink 使用 stat 请添加参数 follow_symlinks=False,或者使用 lstat()。
>>> p = Path('setup.py')>>> p.stat().st_size956>>> p.stat().st_mtime1327883547.852554
在 3.10 版更改: 增加了 follow_symlinks 形参。
Path.chmod(mode, **, follow_symlinks=True*)
改变文件模式和权限,和 os.chmod() 一样。
此方法通常会跟随符号链接。 某些 Unix 变种支持改变 symlink 本身的权限;在这些平台上你可以添加参数 follow_symlinks=False,或者使用 lchmod()。
>>> p = Path('setup.py')>>> p.stat().st_mode33277>>> p.chmod(0o444)>>> p.stat().st_mode33060
在 3.10 版更改: 增加了 follow_symlinks 形参。
Path.exists()
此路径是否指向一个已存在的文件或目录:
>>> Path('.').exists()True>>> Path('setup.py').exists()True>>> Path('/etc').exists()True>>> Path('nonexistentfile').exists()False
备注
如果路径指向一个符号链接, exists() 返回此符号链接是否指向存在的文件或目录。
Path.expanduser()
返回带有扩展 ~ 和 ~user 构造的新路径,与 os.path.expanduser() 所返回的相同。 如果无法解析家目录,则会引发 RuntimeError。
>>> p = PosixPath('~/films/Monty Python')>>> p.expanduser()PosixPath('/home/eric/films/Monty Python')
3.5 新版功能.
Path.glob(pattern)
解析相对于此路径的通配符 pattern,产生所有匹配的文件:
>>> sorted(Path('.').glob('*.py'))[PosixPath('pathlib.py'), PosixPath('setup.py'), PosixPath('test_pathlib.py')]>>> sorted(Path('.').glob('*/*.py'))[PosixPath('docs/conf.py')]
pattern 的形式与 fnmatch 的相同,还增加了 “**“ 表示 “此目录以及所有子目录,递归”。 换句话说,它启用递归通配:
>>> sorted(Path('.').glob('**/*.py'))[PosixPath('build/lib/pathlib.py'),PosixPath('docs/conf.py'),PosixPath('pathlib.py'),PosixPath('setup.py'),PosixPath('test_pathlib.py')]
备注
在一个较大的目录树中使用 “**“ 模式可能会消耗非常多的时间。
引发一个 审计事件 pathlib.Path.glob 附带参数 self, pattern。
在 3.11 版更改: Return only directories if pattern ends with a pathname components separator (sep or altsep).
Path.group()
返回拥有此文件的用户组。如果文件的 GID 无法在系统数据库中找到,将抛出 KeyError 。
Path.is_dir()
如果路径指向一个目录(或者一个指向目录的符号链接)则返回 True,如果指向其他类型的文件则返回 False。
当路径不存在或者是一个破损的符号链接时也会返回 False;其他错误(例如权限错误)被传播。
Path.is_file()
如果路径指向一个正常的文件(或者一个指向正常文件的符号链接)则返回 True,如果指向其他类型的文件则返回 False。
当路径不存在或者是一个破损的符号链接时也会返回 False;其他错误(例如权限错误)被传播。
Path.is_mount()
如果路径是一个 挂载点 path/.. 是否处于一个和 path 不同的设备中,或者 file:path/.. 和 path 是否指向相同设备的相同 i-node —— 这能检测所有 Unix 以及 POSIX 变种上的挂载点。 Windows 上未实现。
3.7 新版功能.
Path.is_symlink()
如果路径指向符号链接则返回 True, 否则 False。
如果路径不存在也返回 False;其他错误(例如权限错误)被传播。
Path.is_socket()
如果路径指向一个 Unix socket 文件(或者指向 Unix socket 文件的符号链接)则返回 True,如果指向其他类型的文件则返回 False。
当路径不存在或者是一个破损的符号链接时也会返回 False;其他错误(例如权限错误)被传播。
Path.is_fifo()
如果路径指向一个先进先出存储(或者指向先进先出存储的符号链接)则返回 True ,指向其他类型的文件则返回 False。
当路径不存在或者是一个破损的符号链接时也会返回 False;其他错误(例如权限错误)被传播。
Path.is_block_device()
如果文件指向一个块设备(或者指向块设备的符号链接)则返回 True,指向其他类型的文件则返回 False。
当路径不存在或者是一个破损的符号链接时也会返回 False;其他错误(例如权限错误)被传播。
Path.is_char_device()
如果路径指向一个字符设备(或指向字符设备的符号链接)则返回 True,指向其他类型的文件则返回 False。
当路径不存在或者是一个破损的符号链接时也会返回 False;其他错误(例如权限错误)被传播。
Path.iterdir()
当路径指向一个目录时,产生该路径下的对象的路径:
>>> p = Path('docs')>>> for child in p.iterdir(): child...PosixPath('docs/conf.py')PosixPath('docs/_templates')PosixPath('docs/make.bat')PosixPath('docs/index.rst')PosixPath('docs/_build')PosixPath('docs/_static')PosixPath('docs/Makefile')
子条目会以任意顺序生成,并且不包括特殊条目 '.' 和 '..'。 如果迭代器创建之后有文件在目录中被移除或添加,是否要包括该文件所对应的路径对象并没有明确规定。
Path.lchmod(mode)
就像 Path.chmod() 但是如果路径指向符号链接则是修改符号链接的模式,而不是修改符号链接的目标。
Path.lstat()
就和 Path.stat() 一样,但是如果路径指向符号链接,则是返回符号链接而不是目标的信息。
Path.mkdir(mode=0o777, parents=False, exist_ok=False
网页题目:创新互联Python教程:pathlib—-面向对象的文件系统路径
网页网址:http://jxjierui.cn/article/djdjhph.html


咨询
建站咨询
