一文去掌握python 中pathlib库

2022-05-21 11:17:33 浏览数 (1)

在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

0 人点赞