python模块之pathlib模块

一:pathlib模块简介

相对于 os 模块的 path 方法,Python3 .4版本开始建议使用标准库 pathlib 模块的 Path, 对路径的操作会更简单
如:获取当前路径,使用os模块写法如下:

import os
current_path1 = os.path.dirname(__file__)
current_path2 = os.getcwd()
print(current_path1, current_path2)

pathlib 获取当前文件路径应该怎么写呢?

import pathlib
current_path = pathlib.Path.cwd()
print(current_path)

在windows上与linux上他们的表现形式不一样:

import pathlib
p = pathlib.Path()
print(type(p))
# windows上:<class 'pathlib.WindowsPath'>
# linux上:<class 'pathlib.PosixPath'>

二:pathlib使用

2.1 目录操作

from pathlib import Path
p = Path()						# 当前目录
p = Path('a', 'b', 'c/d')		# 当前目录下的a/b/c/d
p = Path('/etc/')				# 根下的etc目录

2.2 获取上层目录

pathlib
按上图所示,获取爷爷目录,os模块的写法:

import os
print(os.path.dirname(os.path.dirname(os.getcwd())))

使用pathlib模块来实现:

import pathlib
print(pathlib.Path.cwd().parent.parent)

2.3 路径拼接和分解

import pathlib
p = pathlib.Path()
p = p / 'a'
print(p.absolute())		# G:\pywwroot\DevOps\a
p1 = 'b' / p
print(p1.absolute())	# G:\pywwroot\DevOps\b\a
p2 = pathlib.Path('c')
p3 = p2 / p1
print(p3.parts)			# ('c', 'b', 'a')
p3.joinpath('etc', 'init.d', pathlib.Path('httpd'))

2.4 PurePath

上面的操作大部分都通过 pathlib 中的 Path 实现,其实它还有另一个模块 PurePath。

PurePath 是一个纯路径对象,纯路径对象提供了实际上不访问文件系统的路径处理操作。有三种方法可以访问这些类,我们也称之为flavor。

PurePath.match
让我们来判断一下,当前文件路径是否有符合 ‘*.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'))

输出:

F:/WWWROOT/crawler <class 'str'>
F:\WWWROOT\crawler\test.py <class 'pathlib.PureWindowsPath'>
True

打印通过 os.path 获取当前路径的结果,得出一个路径字符串;而通过 pathlib.Pure 则获得的是一个 PurePosixPath 对象,并且得到的路径包括了当前文件 coder.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。
您希望确保您的代码仅操作路径而不实际访问操作系统。在这种情况下,实例化其中一个纯类可能很有用,因为那些只是没有任何操作系统访问操作。

附上了一张图:
pathlib

2.5 对应关系

通过以上的例子我们可以感受到,它不仅封装了 os.path 相关常用方法,还集成了 os 的其他模块,比如创建文件夹 Path.mkdir。

如果你担心记不住,没关系的,文档一直都在。并且文档给我们列出了对应关系表
pathlib

2.6 基本用法

Path.iterdir()  	# 遍历目录的子目录或者文件
Path.is_dir()  	# 判断是否是目录
Path.glob()  		# 过滤目录(返回生成器)
Path.resolve()  	# 返回绝对路径
Path.exists()  	# 判断路径是否存在
Path.open()  		# 打开文件(支持with)
Path.unlink()  	# 删除文件或目录(目录非空触发异常)

2.7 基本属性

Path.parts  	# 分割路径 类似os.path.split(), 不过返回元组
Path.drive  	# 返回驱动器名称
Path.root  	# 返回路径的根目录
Path.anchor  	# 自动判断返回drive或root
Path.parents  # 返回所有上级目录的列表

2.8 改变路径

Path.with_name()  	# 更改路径名称, 更改最后一级路径名
Path.with_suffix()  	# 更改路径后缀

2.9 测试路径

Path.match()  		# 测试路径是否符合pattern
Path.is_dir()  		# 是否是文件
Path.is_absolute()  	# 是否是绝对路径
Path.is_reserved()  	# 是否是预留路径
Path.exists()  		# 判断路径是否真实存在

2.10 其他方法

Path.cwd()  		# 返回当前目录的路径对象
Path.home()  		# 返回当前用户的home路径对象
Path.stat()  		# 返回路径信息, 同os.stat()
Path.chmod()  	# 更改路径权限, 类似os.chmod()
Path.expanduser()  # 展开~返回完整路径对象
Path.mkdir()  	# 创建目录
Path.rename()  	# 重命名路径
Path.rglob()  	# 递归遍历所有子目录的文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值