相信你一定用os库对文件系统进行过操作,比如文件读写,路径组合,上传下载等都会涉及到文件路径。但是某些操作使用os库就很不优雅,例如查找上级路径,不同操作系统间的路径处理等。今天我们就介绍一个Python内置的面向对象的路径库pathlib。
1、获取当前文件所在路径
from os import path exec_path = path.dirname(__file__) print(exec_path,type(exec_path)) from pathlib import Path,PurePath cur_path = Path(__file__).parent print(cur_path,type(cur_path)) 复制代码
运行结果:
e:/TestProject/iaas/test_data <class 'str'> e:\TestProject\iaas\test_data <class 'pathlib.WindowsPath'> 复制代码
小结
- os库返回的路径是str对象
- 而pathlib返回的路径是一个WindowsPath的对象
- WindowsPath对象有很多路径的属性,而str只有str的属性
2、获取当前文件的名称
from os import path exec_path = path.basename(__file__) print(exec_path,type(exec_path)) from pathlib import Path,PurePath cur_path = Path(__file__).name print(cur_path,type(cur_path)) 复制代码
运行结果:
t_test.py <class 'str'> t_test.py <class 'str'> 复制代码
小结
- os的库获取当前文件名称需要使用basename方法实现
- pathlib获取当前文件名称只需要获取name属性的值即可
3、查找父路径
from os import path,getcwd ''' cur_path:当前路径 par_path:父路径 gra_path:父父路径 ''' cur_path = path.dirname(__file__) par_path = path.dirname(path.dirname(__file__)) gra_path = path.dirname(path.dirname(path.dirname(__file__))) print(cur_path) print(par_path) print(gra_path) from pathlib import Path,PurePath cur_path = Path(__file__).parent par_path = cur_path.parent gra_path = par_path.parent print(cur_path) print(par_path) print(gra_path) 复制代码
运行结果:
e:/TestProject/iaas/test_data e:/TestProject/iaas e:/TestProject e:\TestProject\iaas\test_data e:\TestProject\iaas e:\TestProject 复制代码
小结
pathlib的方式要比os的方式优雅甚多,突出体现了面向对象的优势。
4、pathlib的PurePath和Path
- PurePath代表纯路径,不代表真正的路径和文件,纯路径对象操作
- Path代表真正的路径和文件,可以判断路径或者文件的属性和是否存在
- Path是PurePath的子类,支持PurePath的各种属性和方法
- PurePath有两个子类,PureWindowsPath和PurePosixPath,分别代表不同的操作系统的纯路径对象
Windows:
from pathlib import Path,PurePath cur_path = Path(__file__) print(cur_path,type(cur_path)) pur_path = PurePath(__file__) print(pur_path,type(pur_path)) 复制代码
运行结果:
e:\TestProject\iaas\test_data\t_test.py <class 'pathlib.WindowsPath'> e:\TestProject\iaas\test_data\t_test.py <class 'pathlib.PureWindowsPath'> 复制代码
Linux:
>>> from pathlib import PurePath >>> from pathlib import Path >>> cur_path = Path('/home/env/internet') >>> print(cur_path,type(cur_path)) /home/env/internet <class 'pathlib.PosixPath'> >>> pur_path = PurePath('/home/env/internet') >>> print(pur_path,type(pur_path)) /home/env/internet <class 'pathlib.PurePosixPath'> 复制代码
小结
使用PurePath就可以实现跨操作系统的路径统一操作。
5、pathlib和os的功能对照
网络异常,图片无法展示
|
6、常用的pathlib.Path相关方法
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() # 递归遍历所有子目录的文件