相信你一定用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() # 递归遍历所有子目录的文件