在python中,我们知道常用的路径的是os模块,这里给大家介绍一个新的模块-pathlib。
相比于老式的 os.path 有几个优势:
老的路径操作函数管理比较混乱,有的是导入 os, 有的又是在 os.path 当中,而新的用法统一可以用 pathlib 管理。
老用法在处理不同操作系统 win,mac 以及 linux 之间很吃力。换了操作系统常常要改代码,还经常需要进行一些额外操作。
老用法主要是函数形式,返回的数据类型通常是字符串。但是路径和字符串并不等价,所以在使用 os 操作路径的时候常常还要引入其他类库协助操作。新用法是面向对象,处理起来更灵活方便。
pathlib 简化了很多操作,用起来更轻松。
我们大概的去看一些操作
Path.cwd 获取当前文件夹路径
代码语言:javascript复制from pathlib import Path
# 1.可以直接调用类方法.cwd()
print(Path.cwd())
# 2.也可以实例化后调用
p = Path('./')
print(p.cwd())
获取当前文件路径
代码语言:javascript复制from pathlib import Path
# 当前文件路径
p = Path(__file__)
print(p)
获取 Path 对象绝对路径
代码语言:javascript复制p = Path('data.json')
print(p) # data.json 对象
print(p.absolute())#绝对路径
代码语言:javascript复制from pathlib import Path
# 当前文件路径
p = Path(__file__)
print(p.absolute()) # 获取绝对路径
print(p.resolve()) # 获取绝对路径
print(p.name) # 获取文件名称 'a1117.py'
print(p.stem) # 只要文件名,不要后缀 a1117
print(p.suffix) # 获取文件 后缀.py
print(p.suffixes) # 文件所有的猴子 ['.py']
print(p.parts) # 拆分路径
获取上层,上上层目录:
print(p.parent) #父目录
print(p.parent.parent) # 父目录的父目录
print(p.parents) # 所有的父级 <WindowsPath.parents>
print(p.anchor) # 目录前面的部分
获取用户home目录
代码语言:javascript复制print(Path.home())
判断文件,文件夹
is_file()判断是不是文件
代码语言:javascript复制print(Path.cwd().is_file())
p = Path('./data.json')
print(p.is_file()) # True
is_dir() 判断是否是文件夹
代码语言:javascript复制print(Path.cwd().is_dir()) # True
# 2.也可以实例化后调用
p = Path('./data.json')
print(p.is_dir()) # False
exists() 判断文件 或文件夹是否存在
代码语言:javascript复制# exists() 判断是否存在
p = Path('./data.json')
print(p.exists()) # True or False
joinpath 拼接目录
代码语言:javascript复制from pathlib import Path
# 当前文件路径
p = Path('./')
print(p.absolute()) #当前绝对路径
print(p.joinpath('data.json')) # 路径拼接data.json
iterdir()遍历文件目录
比如在当前脚本的 files 目录有以下文件夹和子文件
.iterdir() 遍历某个目录下的所有路径(文件和子目录)
代码语言:javascript复制p = Path('files')
for i in p.iterdir():
print(i.absolute())
如果只需获取文件夹,可以加个判断.is_dir()
代码语言:javascript复制p = Path('files')
print([i for i in p.iterdir() if i.is_dir()])
也可以用.is_file获取文件对象
代码语言:javascript复制p = Path('files')
print([i for i in p.iterdir() if i.is_file()])
glob() 和 rglob() 模式匹配(正则表达式)
使用模式匹配(正则表达式)匹配指定的路径。glob 只会匹配当前目录下, rglob 会递归所有子目录 比如在当前脚本的 files 目录有以下文件夹和子文件
glob 只会匹配当前目录下
代码语言:javascript复制from pathlib import Path
p = Path('files')
# glob 只会遍历查找当前目录
print(p.glob('*.txt')) # <generator object Path.glob at 0x000001A44565A518>
print([i for i in p.glob('*.txt')]) # [WindowsPath('files/username.txt')]
print([i for i in p.glob('*.yml')]) # []
rglob 会递归所有子目录
代码语言:javascript复制from pathlib import Path
p = Path('files')
# glob 只会遍历查找当前目录
print(p.rglob('*.txt')) # <generator object Path.glob at 0x000001A44565A518>
print([i for i in p.rglob('*.txt')])
print([i for i in p.rglob('*.yml')])
match() 检查路径是否符合规则
代码语言:javascript复制p = Path('data.json')
# math 检查匹配规则
print(p.match('*.json')) # True
创建文件操作
touch() 创建文件
代码语言:javascript复制p = Path('xx.json')
p.touch() # 创建一个xx.json
mkdir() 创建目录
代码语言:javascript复制p = Path('leizi')
p.mkdir()
递归创建目录mkdir(parents=True)
删除文件操作
删除目录非常危险,并且没有提示,一定要谨慎操作
rmdir() 一次只删除一级目录,且当前目录必须为空
代码语言:javascript复制from pathlib import Path
p = Path('nam')
p.rmdir()
unlink() 删除文件
代码语言:javascript复制p = Path('files/username.txt')
p.unlink()
文件读写操作
pathlib 对读取和写入进行了简单的封装,不再需要重复去打开文件和管理文件的关闭了。
read_text() 读取文本
read_bytes() 读取 bytes
write_text() 写入文本
write_bytes() 写入 tytes