pathlib的使用
转载自公众号:进击的Coder,作者:韦世东
一、介绍
pathlib 是Python内置库,Python 文档给它的定义是 Object-oriented filesystem paths(面向对象的文件系统路径)。pathlib 提供表示文件系统路径的类,其语义适用于不同的操作系统。路径类在纯路径之间划分,纯路径提供纯粹的计算操作而没有I / O,以及具体路径,它继承纯路径但也提供I / O操作。
pathlib中的Path类可以创建path路径对象, 属于比os.path更高抽象级别的对象。
纯路径在某些特殊情况下很有用,例如:
如果要在Unix计算机上操作Windows路径(反之亦然)。WindowsPath在Unix上运行时无法实例化,但可以实例化PureWindowsPath(纯路径)
你希望确保你的代码仅在不实际访问操作系统的情况下操作路径。在这种情况下,实例化其中一个纯类可能很有用,因为那些只是没有任何操作系统访问操作。
二、初步使用
1、os模块获取当前文件路径
相对于 os 模块的 path 方法,Python3 标准库 pathlib 模块的 Path 对路径的操作会更简单。
使用 os 模块时,有两种方法可以直接获取当前文件路径
import os v1 = os.path.dirname(__file__) v2 = os.getcwd() print(v1) # D:/Projects/Test print(v2) # D:\Projects\Test
2、pathlib 获取当前文件路径
官方文档建议
import pathlib v = pathlib.Path.cwd() print(v) # D:\Projects\Test
它是如何实现的?文档中有介绍,它以 os.getcwd() 的形式将路径返回。
@classmethod def cwd(cls): """Return a new path pointing to the current working directory (as returned by os.getcwd()). """ return cls(os.getcwd())
原来它是对 os 模块中一些对象进行了封装,看 cwd 的注释:Return a new path pointing to the current working directory
意为:返回指向当前工作目录的新路径。
看起来也没什么特别的,但是为什么官方特意将它推出呢?
其实 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 的构成,接下来让我们感受一下它带给我们的便捷。
三、pathlib 的便捷操作
1、获取上层/上层目录
也就是获取它爷爷的名字
1.os 模块的写法
import os print(os.path.dirname(os.path.dirname(os.getcwd()))) # D:\
2.pathlib的写法
import pathlib print(pathlib.Path.cwd().parent.parent) # D:\
parent 就完事了,这是不是更贴近 Pythonic ?像写英语一样写代码
如果你只需要找到它爸爸,那就使用一次
import pathlib print(pathlib.Path.cwd().parent)
你还可以继续往祖辈上找
import pathlib print(pathlib.Path.cwd().parent.parent.parent)
相对与之前 os 模块使用的多层 os.path.dirname,使用 parent 显然便捷很多
2、路径拼接
1.os的拼接方式
如果你要在它爷爷辈那里拼接路径,那么你需要写这么长一串代码
import os v = os.path.join(os.path.dirname(os.path.dirname(os.getcwd())), "Hello", "World") print(v) # D:\Hello\World
2.用 pathlib 拼接
import pathlib parts = ["Hello", "World"] v = pathlib.Path.cwd().parent.parent.joinpath(*parts) print(v) # D:\Hello\World
而且你还可以通过增加或减少 parent 的数量,来实现它祖辈的调节,美哉。
四、pathlib的其他用法
上面的操作大部分都通过 pathlib 中的 Path 实现,其实它还有另一个模块 PurePath。
PurePath 是一个纯路径对象,纯路径对象提供了实际上不访问文件系统的路径处理操作。有三种方法可以访问这些类,我们也称之为flavor。
1、PurePath.match
让我们来判断一下,当前文件路径是否有符合 '*.py' 规则的文件
import pathlib v = pathlib.PurePath(__file__).match('*.py') print(v) # 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)) # D:\Projects\Test <class 'str'> print(pure_path, type(pure_path)) # D:\Projects\Test\test.py <class 'pathlib.PureWindowsPath'> print(pathlib.PurePath(__file__).match('*.py')) # True
打印通过 os.path 获取当前路径的结果,得出一个路径字符串;而通过 pathlib.Pure 则获得的是一个PureWindowsPath 对象,并且得到的路径包括了当前文件 test.py(我当前就是使用test.py写着这段测试的代码)。
这就有点悬疑了, PureWindowsPath 和 PurePosixPath 究竟是什么?
pathlib 可以操作两种文件系统的路径,一种是 Windows 文件系统,另一种称为非 Windows 文件系统,对应的对象是 PureWindowsPath 和 PurePosixPath ,不过不用担心,这些类并非是指定在某些操作系统上运行才能够使用,无论你运行的是哪个系统,都可以实例化所有这些类,因为它们不提供任何进行系统调用的操作。
不提供任何进行系统调用的操作,这又是什么?真是越听越深了
文档在最开始给出了这么一段描述:
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。 您希望确保您的代码仅操作路径而不实际访问操作系统。在这种情况下,实例化其中一个纯类可能很有用,因为那些只是没有任何操作系统访问操作。
官方给 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 不单纯是对 os 中一些模块或方法进行封装,而是为了兼容不同的操作系统,它为每类操作系统定义了接口。你希望在UNIX机器上操作Windows的路径,然而直接操作是做不到的,所以为你创建了一套接口 PurePath,你可以通过接口来实现你的目的(反之亦然)
2、对应关系
通过以上的例子我们可以感受到,它不仅封装了 os.path 相关常用方法,还集成了 os 的其他模块,比如创建文件夹 Path.mkdir。
如果你担心记不住,没关系的,文档一直都在。并且文档给我们列出了对应关系表
3、基本用法
Path.iterdir() # 遍历目录的子目录或者文件 Path.is_dir() # 判断是否是目录 Path.glob() # 过滤目录(返回生成器) Path.resolve() # 返回绝对路径 Path.exists() # 判断路径是否存在 Path.open() # 打开文件(支持with) Path.unlink() # 删除文件或目录(目录非空触发异常)
4、基本属性
Path.parts # 分割路径 类似os.path.split(), 不过返回元组 Path.drive # 返回驱动器名称 Path.root # 返回路径的根目录 Path.anchor # 自动判断返回drive或root Path.parents # 返回所有上级目录的列表
5、改变路径
Path.with_name() # 更改路径名称, 更改最后一级路径名 Path.with_suffix() # 更改路径后缀
6、拼接路径
Path.joinpath() # 拼接路径 Path.relative_to() # 计算相对路径
7、测试路径
Path.match() # 测试路径是否符合pattern Path.is_dir() # 是否是文件 Path.is_absolute() # 是否是绝对路径 Path.is_reserved() # 是否是预留路径 Path.exists() # 判断路径是否真实存在
8、其他方法
Path.cwd() # 返回当前目录的路径对象 Path.home() # 返回当前用户的home路径对象 Path.stat() # 返回路径信息, 同os.stat() Path.chmod() # 更改路径权限, 类似os.chmod() Path.expanduser() # 展开~返回完整路径对象 Path.mkdir() # 创建目录 Path.rename() # 重命名路径 Path.rglob() # 递归遍历所有子目录的文件
原文地址:https://www.cnblogs.com/Zzbj/p/11346200.html
- Go基础之--结构体和方法
- go基础之--函数和map
- docStrings报错
- java中如何初始化接口
- 你和PPT高手之间,就只差一个iSlide
- 如何在原生微信小程序中实现数据双向绑定
- 追溯 React Hot Loader 的实现
- 【推荐】开源项目minapp-重新定义微信小程序的开发
- 【完结汇总】iKcamp出品基于Koa2搭建Node.js实战共十一堂课(含视频)
- hadoop性能调优
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 规范与部署
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
- DiscuzX v3.4 任意文件删除漏洞
- 系列3|走进Node.js之多进程模型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Kubernetes K8S之SSL证书有效期修改
- Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解
- Kubernetes K8S之kubectl命令详解及常用示例
- Kubernetes K8S之Pod 生命周期与init container初始化容器详解
- Kubernetes K8S之Pod生命周期与探针检测
- Kubernetes K8S之Pod 生命周期与postStart、preStop事件
- Kubernetes K8S之资源控制器RC、RS、Deployment详解
- python教程 | 最标准的地图调用方式(国家测绘局提供数据)
- Kubernetes K8S之资源控制器StatefulSets详解
- Kubernetes K8S之资源控制器Daemonset详解
- Kubernetes K8S之资源控制器Job和CronJob详解
- Kubernetes K8S在IPVS代理模式下Service服务的ClusterIP类型访问失败处理
- Kubernetes K8S之Pod跨namespace名称空间访问Service服务
- Kubernetes K8S之Service服务详解与示例
- Kubernetes K8S之Ingress详解与示例