相比经常使用的 os.path而言,pathlib 对于目录路径的操做更简介也更贴近 Pythonic。可是它不单纯是为了简化操做,还有更大的用途html
pathlib 是Python内置库,Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径)。pathlib 提供表示文件系统路径的类,其语义适用于不一样的操做系统。路径类在纯路径之间划分,纯路径提供纯粹的计算操做而没有I / O,以及具体路径,它继承纯路径但也提供I / O操做。python
听起来有点绕?那就对了,毕竟这是直译过来的,但这并不影响咱们喜好它。 咱们经过几个例子来了解它吧bash
相对于 os 模块的 path 方法,Python3 标准库 pathlib 模块的 Path 对路径的操做会更简单。微信
使用 os 模块时,有两种方法能够直接获取当前文件路径:app
import os
value1 = os.path.dirname(__file__)
value2 = os.getcwd()
print(value1)
print(value2)
复制代码
pathlib 获取当前文件路径应该怎么写呢?编辑器
官方文档给出了建议 插眼传送ide
动手试一试测试
import pathlib
value1 = pathlib.Path.cwd()
print(value1)
复制代码
文档中有介绍,它以 os.getcwd() 的形式将路径返回。咱们去源码中一探究竟(Pycharm 编辑器快捷键 ctrl+鼠标左键点击便可跟进指定对象)ui
原来它是对 os 模块中一些对象进行了封装,看 cwd 的注释: Return a new path pointing to the current working directory
意为:返回指向当前工做目录的新路径。this
看起来也没什么特别的,可是为何官方特地将它推出呢?
pathlib 封装了不少的 os path ,文档中有写明,如:
# 关系说明
os.path.expanduser() --> pathlib.Path.home()
os.path.expanduser() --> pathlib.Path.expanduser()
os.stat() --> pathlib.Path.stat()
os.chmod() --> pathlib.Path.chmod()
复制代码
官网文档截图:
详细请查看官方文档:插眼传送
刚才的案例并不能说明什么,只是让咱们了解到 pathlib 的构成,接下来让咱们感觉一下它带给咱们的便捷。
也就是获取它爷爷的名字
import os
print(os.path.dirname(os.path.dirname(os.getcwd())))
复制代码
若是用 pathlib 来实现:
import pathlib
print(pathlib.Path.cwd().parent.parent)
复制代码
parent 就完事了,这是否是更贴近 Pythonic ? 像写英语同样写代码。
若是你只须要找到它爸爸,那就使用一次:
import pathlib
print(pathlib.Path.cwd().parent)
复制代码
你还能够继续往祖辈上找:
import pathlib
print(pathlib.Path.cwd().parent.parent.parent)
复制代码
相对与以前 os 模块使用的多层 os.path.dirname,使用 parent 是否是便捷不少?
若是你要在它爷爷辈那里拼接路径,那么你须要写这么长一串代码:
import os
print(os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), "关注", "微信公众号", "【进击的", "Coder】"))
复制代码
当你用 pathlib 的时候,你必定可以感觉到快乐:
import pathlib
parts = ["关注", "微信公众号", "【进击的", "Coder】"]
print(pathlib.Path.cwd().parent.parent.joinpath(*parts))
复制代码
并且你还能够经过增长或减小 parent 的数量,来实现它祖辈的调节,美哉。
上面的操做大部分都经过 pathlib 中的 Path 实现,其实它还有另外一个模块 PurePath。
PurePath 是一个纯路径对象,纯路径对象提供了实际上不访问文件系统的路径处理操做。有三种方法能够访问这些类,咱们也称之为flavor。
上面这句话来自于官方文档,听起来仍是有点绕,咱们仍是经过栗子来了解它吧
让咱们来判断一下,当前文件路径是否有符合 '*.py' 规则的文件
import pathlib
print(pathlib.PurePath(__file__).match('*.py'))
复制代码
很显然,咱们编写代码的 coder.py 就符合规则,因此输出是 True。
为何我要拿这个来举例呢?再深刻想一下 pathlib.PurePath 后面可以跟着 match,那说明它应该是个对象,而不是一个路径字符串。为了验证这个想法,把代码改一改:
import pathlib
import os
os_path = os.path.dirname(__file__)
pure_path = pathlib.PurePath(__file__)
print(os_path, type(os_path))
print(pure_path, type(pure_path))
print(pathlib.PurePath(__file__).match('*.py'))
复制代码
这就有点悬疑了, PurePosixPath 到底是什么?
pathlib 能够操做两种文件系统的路径,一种是 Windows 文件系统,另外一种称为非 Windows 文件系统,对应的对象是 pathlib.PurePosixPath 和 PureWindowsPath,不过不用担忧,这些类并不是是指定在某些操做系统上运行才可以使用,不管你运行的是哪一个系统,均可以实例化全部这些类,由于它们不提供任何进行系统调用的操做。
不提供任何进行系统调用的操做,这又是什么?真是越听越深了
文档在最开始给出了这么一段描述:
Pure paths are useful in some special cases; for example: If you want to manipulate Windows paths on a Unix machine (or vice versa). You cannot instantiate a WindowsPath when running on Unix, but you can instantiate PureWindowsPath. You want to make sure that your code only manipulates paths without actually accessing the OS. In this case, instantiating one of the pure classes may be useful since those simply don’t have any OS-accessing operations.
翻译:纯路径在某些特殊状况下颇有用; 例如: 若是要在Unix计算机上操做Windows路径(反之亦然)。WindowsPath在Unix上运行时没法实例化,但能够实例化PureWindowsPath。 您但愿确保您的代码仅操做路径而不实际访问操做系统。在这种状况下,实例化其中一个纯类可能颇有用,由于那些只是没有任何操做系统访问操做。
还附上了一张图:
一会儿也不是很理解,这是什么意思。没关系,继续往下看。
经过以上的例子咱们能够感觉到,它不只封装了 os.path 相关经常使用方法,还集成了 os 的其余模块,好比建立文件夹 Path.mkdir。
若是你担忧记不住,不要紧的,文档一直都在。而且文档给咱们列出了对应关系表
Path.iterdir() # 遍历目录的子目录或者文件
Path.is_dir() # 判断是不是目录
Path.glob() # 过滤目录(返回生成器)
Path.resolve() # 返回绝对路径
Path.exists() # 判断路径是否存在
Path.open() # 打开文件(支持with)
Path.unlink() # 删除文件或目录(目录非空触发异常)
Path.parts # 分割路径 相似os.path.split(), 不过返回元组
Path.drive # 返回驱动器名称
Path.root # 返回路径的根目录
Path.anchor # 自动判断返回drive或root
Path.parents # 返回全部上级目录的列表
Path.with_name() # 更改路径名称, 更改最后一级路径名
Path.with_suffix() # 更改路径后缀
Path.joinpath() # 拼接路径
Path.relative_to() # 计算相对路径
Path.match() # 测试路径是否符合pattern
Path.is_dir() # 是不是文件
Path.is_absolute() # 是不是绝对路径
Path.is_reserved() # 是不是预留路径
Path.exists() # 判断路径是否真实存在
Path.cwd() # 返回当前目录的路径对象
Path.home() # 返回当前用户的home路径对象
Path.stat() # 返回路径信息, 同os.stat()
Path.chmod() # 更改路径权限, 相似os.chmod()
Path.expanduser() # 展开~返回完整路径对象
Path.mkdir() # 建立目录
Path.rename() # 重命名路径
Path.rglob() # 递归遍历全部子目录的文件
经过上面的几个例子,咱们对 pathlib 应该有一个大致的了解,接下来再回顾一下官方给 pathlib 库的定义:
This module offers classes representing filesystem paths with semantics appropriate for different operating systems. Path classes are divided between pure paths, which provide purely computational operations without I/O, and concrete paths, which inherit from pure paths but also provide I/O operations.
释义:pathlib 提供表示文件系统路径的类,其语义适用于不一样的操做系统。路径类在纯路径之间划分,纯路径提供纯粹的计算操做而没有I / O,以及具体路径,它继承纯路径但也提供I / O操做。
回顾刚才这张图,从新理解 pathlib
若是你之前从未使用过这个模块,或者只是不肯定哪一个类适合您的任务,那么Path极可能就是您所须要的。它为代码运行的平台实例化一个具体路径。
总结:pathlib 不单纯是对 os 中一些模块或方法进行封装,而是为了兼容不一样的操做系统,它为每类操做系统定义了接口。你但愿在UNIX机器上操做Windows的路径,然而直接操做是作不到的,因此为你建立了一套接口 PurePath,你能够经过接口来实现你的目的(反之亦然)