Pathlib 比 OS 更好的路径库
共 3663字,需浏览 8分钟
·
2021-02-14 15:26
你好,我是悦创。
在前面的 Python 办公自动化的文章中,我使用到了 Pathlib 这个库,接下来我们来看看这个库一些简单用法。
该模块提供表示文件系统路径的类,其语义适用于不同的操作系统。路径类被分为提供纯计算操作而没有 I/O 的 纯路径,以及从纯路径继承而来但提供 I/O 操作的 具体路径。如果以前从未用过此模块,或不确定哪个类适合完成任务,那要用的可能就是 Path
。它在运行代码的平台上实例化为 具体路径。
「在一些用例中纯路径很有用,例如:」
如果你想要在 Unix 设备上操作 Windows 路径(或者相反)。你不应在 Unix 上实例化一个
WindowsPath
,但是你可以实例化PureWindowsPath
。你只想操作路径但不想实际访问操作系统。在这种情况下,实例化一个纯路径是有用的,因为它们没有任何访问操作系统的操作。
总结:纯路径就只有路径,具体路径看操作。
基础使用
「导入主类:」
In [1]: from pathlib import Path
「列出子目录:」
In [2]: p = Path(".")
In [3]: [x for x in p.iterdir() if x.is_dir()]
Out[3]:
[PosixPath('第四章:Word自动化处理'),
PosixPath('第五章:PTT自动化处理'),
PosixPath('第三章:Excel自动化处理')]
「iterdir():「遍历此目录中的文件。对于特殊路径 “」.」” 和 “「..」” 不会产生任何结果。 **is_dir():**此路径是否为目录。
「列出当前目录树下的所有 Python 源代码文件:」
In [45]: list(p.glob('**/*.py'))
Out[45]:
[PosixPath('第五章:PTT自动化处理/8.Python生成数据动图/data_change_to_gif.py'),
PosixPath('第三章:Excel自动化处理/10.多线程Excel像素画/Excel_paint.py')]
「在目录树中移动:」
In [51]: p = Path('/etc')
In [52]: q = p / 'init.d' / 'reboot'
In [53]: q
Out[53]: PosixPath('/etc/init.d/reboot')
In [54]: q.resolve()
Out[54]: PosixPath('/private/etc/init.d/reboot')
「查询路径的属性:」
In [61]: p = Path(".")
In [62]: p.exists() # 此路径是否指向一个已存在的文件或目录,目录存在则为:True,不存在则为:False
Out[62]: True
In [63]: p.is_dir() # 如果路径指向一个目录(或者一个指向目录的符号链接)则返回 True,如果指向其他类型的文件则返回 False。简化的翻译:此路径是否为目录。
Out[63]: True
**
纯路径
**纯路径对象提供了不实际访问文件系统的路径处理操作。**有三种方式来访问这些类,也是不同的风格:「class pathlib.PurePath(*pathsegments)」一个通用的类,代表当前系统的路径风格(实例化为 PurePosixPath
或者 PureWindowsPath
):
In [74]: from pathlib import PurePath
In [75]: PurePath('setup.py') # Running on a Unix machine
Out[75]: PurePosixPath('setup.py')
每一个 pathsegments 的元素可能是一个代表路径片段的字符串,一个返回字符串的实现了 os.PathLike
接口的对象,或者另一个路径对象:
In [76]: PurePath('foo', 'some/path', 'bar')
Out[76]: PurePosixPath('foo/some/path/bar')
In [77]: PurePath(Path('foo'), Path('bar'))
Out[77]: PurePosixPath('foo/bar')
当 pathsegments 为空的时候,假定为当前目录:
In [86]: PurePath()
Out[86]: PurePosixPath('.')
当给出一些绝对路径,最后一位将被当作锚(模仿 os.path.join()
的行为):
In [90]: from pathlib import PurePath, PureWindowsPath
In [91]: PurePath('/etc', '/usr', 'lib64')
Out[91]: PurePosixPath('/usr/lib64')
In [92]: PureWindowsPath('c:/Windows', '/Program Files')
Out[92]: PureWindowsPath('c:/Program Files')
假斜线和单独的点都会被消除,但是双点 (‘..’
) 不会,以防改变符号链接的含义。
In [93]: PurePath('foo//bar')
Out[93]: PurePosixPath('foo/bar')
In [94]: PurePath('foo/./bar')
Out[94]: PurePosixPath('foo/bar')
In [95]: PurePath('foo/../bar')
Out[95]: PurePosixPath('foo/../bar')
(一个很 naïve 的做法是让 PurePosixPath('foo/../bar')
等同于 PurePosixPath('bar')
,如果 foo
是一个指向其他目录的符号链接那么这个做法就将出错)
纯路径对象实现了 os.PathLike
接口,允许它们在任何接受此接口的地方使用。_在 3.6 版更改: _添加了 os.PathLike
接口支持。class pathlib.PurePosixPath(*pathsegments)
一个 PurePath
的子类,路径风格不同于 Windows 文件系统:
In [98]: PurePosixPath('/etc')
Out[98]: PurePosixPath('/etc')
pathsegments 参数的指定和 PurePath
相同。class pathlib.``PureWindowsPath
(*pathsegments)PurePath
的一个子类,路径风格为 Windows 文件系统路径:
In [100]: PureWindowsPath('c:/Program Files/')
Out[100]: PureWindowsPath('c:/Program Files')
pathsegments 参数的指定和 PurePath
相同。无论你正运行什么系统,你都可以实例化这些类,因为它们提供的操作不做任何系统调用。
通用性质
路径是不可变并可哈希的。相同风格的路径可以排序与比较。这些性质尊重对应风格的大小写转换语义:
In [101]: PurePosixPath('foo') == PurePosixPath('FOO')
Out[101]: False
In [102]: PureWindowsPath('foo') == PureWindowsPath('FOO')
Out[102]: True
In [103]: PureWindowsPath('FOO') in { PureWindowsPath('foo') }
Out[103]: True
In [104]: PureWindowsPath('C:') < PureWindowsPath('d:')
Out[104]: True
不同风格的路径比较得到不等的结果并且无法被排序:
In [105]: PureWindowsPath('foo') == PurePosixPath('foo')
Out[105]: False
更多知识点可以参考:https://docs.python.org/zh-cn/3/library/pathlib.html
长按识别下方二维码,和众多位岛民一起
把别人的顿悟,变成你的基本功
花半秒钟就看透事物本质的人,
和花一辈子都看不清的人,
注定是截然不同的命运。