pathlib库,文件与文件夹处理的 "四大天王" 之一,贼好用!

0 评论
/ /
246 阅读
/
7668 字
06 2023-12

好了,废话不多说,直接开始pathlib模块的讲解吧!在使用之前,需要提前导入pathlib库。

from pathlib import Path
最重要的Path对象

Path对象是这个库的核心,里面有着超级多好用的文件、文件夹处理方法,供我们调用。

① 当前路径下的Path对象

p = Path.cwd()
p

结果如下:

WindowsPath('C:/Users/Administrator')

② 任意指定路径下的Path对象

p = Path('C:/Users/Administrator/Desktop/python三剑客/pathlib库/抽奖.txt')
p

结果如下:

WindowsPath('C:/Users/Administrator/Desktop/python三剑客/pathlib库/抽奖.txt')

从上图可以看出,Path对象既可以是一个文件对象,也可以是一个文件夹对象。根据不同对象,调用相应方法,就可以很便捷的处理文件或文件夹。

获取文件的具体信息

我们既然针对某个文件操作,所以首先应该获取到文件的Path对象。

p = Path("抽奖.txt")
p.stat()

结果如下:

os.stat_result(st_mode=33206, st_ino=3377699720953729, st_dev=43058258, st_nlink=1,
 st_uid=0, st_gid=0, st_size=84, st_atime=1701415115, st_mtime=1699522087,
 st_ctime=1678864058)

路径拼接

进行路径拼接,直接使用一个/斜杠即可。

p = Path('C:/Users/Administrator/Desktop/python三剑客')
p1 = p/'pathlib库'
p1

结果如下:

WindowsPath('C:/Users/Administrator/Desktop/python三剑客/pathlib库')

获取上级目录

p = Path.cwd()
p.parent
p.parent.parent

结果如下:

WindowsPath('C:/')

获取文件的具体信息

我们先获取到文件的Path对象。

p = Path("抽奖.txt")
p.stat()

结果如下:

os.stat_result(st_mode=33206, st_ino=3377699720953729, st_dev=43058258, st_nlink=1, st_uid=0, st_gid=0, st_size=84, st_atime=1701415115, st_mtime=1699522087, st_ctime=1678864058)

获取指定路径下所有文件/文件夹的路径信息

以当前工作目录为例:在当前工作目录下,有下方这些文件。

C:\Users\Administrator\#04A50706.jpg
C:\Users\Administrator\#3F865C4C.xls
C:\Users\Administrator\#E7DA92A6.pptx
C:\Users\Administrator\#FC5B32A2.doc
C:\Users\Administrator\$118C6C9A.pptx
C:\Users\Administrator\$53D530AB.doc

如何获取每个文件对应的路径信息呢?

p = Path.cwd()
for i in p.iterdir():
    print(i)

结果如下:

C:\Users\Administrator\#04A50706.jpg
C:\Users\Administrator\#3F865C4C.xls
C:\Users\Administrator\#E7DA92A6.pptx
C:\Users\Administrator\#FC5B32A2.doc
C:\Users\Administrator\$118C6C9A.pptx
C:\Users\Administrator\$53D530AB.doc

注意: iterdir()方法返回的是直接子文件或子文件夹【不考虑嵌套文件夹中的文件】。

获取指定路径下"符合条件"文件的路径信息

仅想要获取直接子文件的路径信息,使用的是glob()方法。

p = Path.cwd()
file_list = p.glob('*.mp4')
for file in file_list:
    print(file)

结果如下:

C:\Users\Administrator\20230522_152840.mp4
C:\Users\Administrator\20230602_173826.mp4
C:\Users\Administrator\20230628_164942.mp4
C:\Users\Administrator\20230905_171401问题解答.mp4
C:\Users\Administrator\20230907_160018.mp4
C:\Users\Administrator\20230908_164218.mp4
C:\Users\Administrator\20230908_170324.mp4
C:\Users\Administrator\20230908_173441fulpage_比图.mp4
C:\Users\Administrator\20230911_150508.mp4
C:\Users\Administrator\20230913_091327.mp4


由于需求改变,我不仅想要获取直接子文件的信息,而且还要递归所有文件夹,找到所有符合条件的文件信息?这里有两种办法:
① 方法一

p = Path.cwd()
file_list = p.glob('**/*.txt')
for file in file_list:
    print(file)


② 方法二

p = Path.cwd()
file_list = p.rglob('*.txt')
for file in file_list:
    print(file)

综上所述:
Ⅰ 不考虑嵌套文件夹中的文件,使用glob()方法;
Ⅱ 考虑嵌套文件夹中的文件,使用rglob()方法;

限制递归次数,访问嵌套文件夹

 如果你有一个嵌套文件夹,嵌套次数很深。但是我们并不需要一直访问到最后一层,应该怎么办呢?

① 不限制递归次数

p = Path.cwd()
file_list = p.rglob('*.txt')

for file in file_list:
    print(file)


② 限制递归次数

p = Path.cwd()
file_list = p.rglob('*.txt')

for i,file in enumerate(file_list):
    if i <= 2:
        print(file)

判断当前路径是否存在某个文件或者文件夹

这个需求很有用,比如我们做文件分类的时候,我们需要创建新的文件夹,用于存放文件。此时,我们需要判断,创建的文件夹是否是不存在的,只有不存在,我们才去创建这个文件夹。

p = Path.cwd()

for i in p.iterdir():
    print(i)

如果有这么些文件,如何判断文件或文件夹,是否存在呢?

r1=Path("C:/Users/Administrator/book.txt").exists()
r2=Path("C:/Users/Administrator").exists()
False
True

创建文件夹

上面我们如果已经判断了不存在b这个文件,那现在我们就来创建它。

p = Path.cwd()
p1 = p/'b'

if not Path('C:/Users/Administrator/Desktop/python三剑客/pathlib库/b').exists():
    p1.mkdir()

上述我们已经为大家创建了单个文件夹,现在我们来创建一个递归文件夹,这里一定要使用parents=True参数。

p = Path.cwd()
p1 = p/'嵌套第一层'/'嵌套第二层'
p1.mkdir(parents=True)

判断某个路径是文件,还是文件夹

p = Path('C:/Users/Administrator/Desktop/python三剑客/pathlib库/抽奖.txt')
p.is_dir()
p.is_file()

文件/文件夹重命名

p = Path('3.gif')
p.rename("重命名_3.gif")

获取文件的文件名和后缀

这个功能真的很赞,超级好用。

p = Path('C:/Users/Administrator/Desktop/python三剑客/pathlib库/抽奖.txt')
p.name
p.suffix