pathlib 模块
pathlib 是 Python3.4 之后新添加的模块,它可以让文件和路径操作变得快捷方便,完美代替 os.path 模块。
该模块提供了用于表示文件系统路径的类,适用于不同的操作系统。路径类被分为提供纯计算操作而不涉及I/O 的 PurePath,以及从纯路径继承而来但提供 I/O操作的Path。
模块解析
路径查询
| Python |
|---|
| # 导入模块
from pathlib import Path
# 获取当前路径的绝对路径
Path.cwd()
# 路径对象,用于对路径进行操作
# 生成路径对象,直接传入Path中
p = Path("/Users/luckyx/Desktop/code/1_idea_code")
# 可以使用拼接创建新的路径对象
q = p / "1.txt"
# 判断路径是否为一个文件夹
p.is_dir() # --> True
q.is_dir() # --> False
# 判断路径是否为一个文件
p.is_file() # --> False
q.is_file() # --> True
# 判断路径是否存在
p.exists() # --> True
# 获取路径的最后一个部分
p.name # --> 1_idea_code
q.name # --> 1.txt
# 获取文件的文件名,如果是路径则返回路径名,文件则返回文件名
p.stem # --> 1_idea_code
q.stem # --> 1
# 获取文件后缀,如果是目录则返回空,如果是文件则返回文件后缀
p.suffix # -->
q.suffix # --> .txt
# 获取其父级目录,是绝对路径
p.parent # --> /Users/luckyx/Desktop/code
q.parent # --> /Users/luckyx/Desktop/code/1_idea_code
# 使用parents可以获取父目录的所有目录的可迭代对象
for i in p.parents:
print(i)
# /Users/luckyx/Desktop/code
# /Users/luckyx/Desktop
# /Users/luckyx
# /Users
# /
# 当然也支持索引功能,超过索引范围会抛出异常
p.parents[0] # --> /Users/luckyx/Desktop/code
p.parents[1] # --> /Users/luckyx/Desktop
p.parents[2] # --> /Users/luckyx
# 将路径的各个组间拆分成元组
p.parts # --> ('/', 'Users', 'luckyx', 'Desktop', 'code', '1_idea_code')
# 查询文件或者文件夹的状态信息
# 1>访问时间(access time 简写为atime)
# 2>修改时间(modify time 简写为mtime)
# 3>状态修改时间(change time 简写为ctime)
p.stat() # --> os.stat_result(st_mode=16877, st_ino=48375226, st_dev=16777230, st_nlink=10, st_uid=501, st_gid=20, st_size=320, st_atime=1683783723, st_mtime=1683783723, st_ctime=1683783723)
# 可以通过下表获取对应的值
p.stat().st_size # 获取文件或文件夹大小 --> 320
# 相对路径
test = Path("./doc") # 当前路径的doc目录
test1 = Path("../doc") # 当前路径的上一级doc目录
# 将相对路径转换成绝对路径
test.resolve() # --> /Users/luckyx/Desktop/code/1_idea_code/doc
# 获取当前路径下的子文件和子文件夹,只能获取当前路径下的,获取不到全部的子文件夹和子文件
test.iterdir() # 是一个生成器,如果没有子文件和子文件夹则为空
# 将当前路径下所有文件整理成一个列表,使用推导式
[i for i in test.iterdir() if i.is_file()]
|
路径修改
| Python |
|---|
| from pathlib import Path
# 创建路径对象
p = Path("/Users/luckyx/Desktop/code/1_idea_code/test")
# 创建文件夹,需要提前创建路径对象
p.mkdir() # 创建test文件夹
# 如果创建的文件夹已经存在,那么再次创建就会抛出异常,使用关键字参数可以避免该异常
p.mkdir(exist_ok=True)
# 如果路径有存在多个不存在的路径,直接创建同样会抛出异常,使用关键字也可以避免该异常
p.mkdir(parents=True)
# Path内部打包了open函数可以直接对文件进行打开关闭写入操作
q = p / "1.txt"
f = q.open("w") # 此时可以对1.txt进行文件操作
# 对文件或文件夹修改名字,注意此时修改的名字需要添加相对路径或绝对路径,不然程序运行后会将文件保存到项目目录
q.rename("/Users/luckyx/Desktop/code/1_idea_code/test/2.txt")
# 替换指定的文件或文件夹,同样需要指定路径,不然会保留到项目目录
q.replace("/Users/luckyx/Desktop/code/1_idea_code/test/a/b/33.txt")
# 删除操作
# 删除文件夹,如果文件夹有文件,直接删除会报错
q.parent.rmdir() # --> 目录存在文件,无法进行删除,此时需要先使用文件删除在进行目录删除
q.unlik() # --> 先对目录下的文件进行删除
q.parent.rmdir() # --> 删除父目录
|
查找功能
| Python |
|---|
| from pathlib import Path
# 创建路径对象
p = Path(".") # --> 当前路径
# 查找当前路径的所有txt文件,返回的是一个迭代器,可以存入列表中,也可以迭代输出
p.glob("*.txt")
# 查找当前路径的下一级路径的所有txt文件
p.glob("*/*.txt")
# 查找当前目录以及向下的所有子目录txt文件
p.glob("**/*.txt")
|
代码示例
| Python |
|---|
| # 在 pathlib 模块中,Path 对象有一个 glob() 方法,它提供了向下递归搜索的能力(如下),请自己编写一个递归函数,实现相同的搜索功能
from pathlib import Path
p = Path.cwd()
file = []
def test(pat, list_data, a):
for i in pat.iterdir():
if i.is_file() and i.suffix == a:
list_data.append(i)
if i.is_dir():
test(i, list_data, a)
return list_data
s = test(p, file, '.py')
print(s)
|