上节课回顾:
1.文件永久存储(上) python文件永久存储(创建打开文件、文件对象的各种方法及含义)
windows系统使用反斜杠\作为路径分隔符。其他系统使用多使用斜杠
1.路径处理
pathlib – 面向对象的文件系统路径
pathlib 是 Python3.4 之后新添加的模块,它可以让文件和路径操作变得快捷方便,完美代替 os.path 模块。
pathlib该模块提供了用于表示文件系统路径的类,适用于不同的操作系统。路径类被分为提供纯计算操作而不涉及 I/O 的 PurePath,以及从纯路径继承而来但提供 I/O 操作的 Path。
旧版路径: 新旧路径处理模块大比拼(pathlib vs os.path)
常用命令如下:
例1:
>>> from pathlib import Path
>>> Path.cwd() # 获取当前目录的路径
WindowsPath('E:/python')
>>> p = Path('E:/python') # 路径刚到p变量里面去
>>> p
WindowsPath('E:/python')
>>> q = p / "FishC.txt" # 使用斜杠进行路径拼接,将文本文件FishC.txt加入路径。
>>> q
WindowsPath('E:/python/FishC.txt')
>>>
例2:
>>> p.is_dir() # 判断一个路径是否为一个文件夹
True
>>> q.is_dir()
False
>>> p.is_file() # 判断一个路径是否为一个文件
False
>>> q.is_file()
True
>>> p.exists() # 检测一个路径是否存在
True
>>> p.exists()
True
>>> Path("C:/404").exists() # 路径不存在时报错。
False
例3:
>>> p.name # 获取路径的最后一个部分
'python'
>>> q.name
'FishC,txt'
>>> p.parent # 获取父级目录
WindowsPath('E:/')
>>> q.parent
WindowsPath('E:/python')
>>> ps=p.parents # parents为获取逻辑祖先路径构成的序列,将其赋给变量ps
>>> for each in ps:
print(each)
E:\
我python路径为E:\python,路径比较短,下面图片中的路径为遍历路径后得到的结果。
代码注释:
变量ps也支持索引,ps[0]为父级目录,减掉一级之后就是ps[1],减掉两级就是ps[2]等等。
p.parts 将路径的各个组件拆分元组
p.stat() 查询文件或文件夹的信息
代码注释:
p.stat().st_size 指的是一个文件的尺寸大小为4096字节,即4kb。
q.stat().st_size 文件是空的,因此大小为0
2.绝对路径 vs 相对路径(路径查询)
绝对路径:文件绝对存在的路径,如果一个路径从根目录开始,然后一级一级地指向最终的文件或者文件夹,那么这个路径就是绝对路径。比如这里的p和q都是绝对路径。
相对路径:是以目录作为基准,进行一级一级的这个目录推导的一个路径,我们使用点来表示当前所在的目录,使用两个紧挨着的点来表示上一级目录。
例4:相对路径
>>> from pathlib import Path
>>> Path("./doc") # 表示相对路径,表示当前路径下的doc这个文件夹
WindowsPath('doc')
>>> Path("../FishC") # 使用两个紧挨着的点来表示上一级路径。
WindowsPath('../FishC')
>>>
例5:
>>> Path("./doc").resolve() # 将相对路径转换为绝对路径
WindowsPath('E:/python/Doc')
>>> Path("../FishC").resolve()
WindowsPath('E:/FishC')
例6:
>>> p = Path('E:/python')
>>> q = p / "FishC,txt"
>>> p.iterdir() # 得到了一个生成器
>>> for each in p.iterdir(): # 获取当前路径下所有子文件和子文件夹。
print(each)
E:\python\DLLs
E:\python\Doc
E:\python\FishC,txt
E:\python\FishC.txt
E:\python\include
E:\python\Lib
E:\python\libs
E:\python\LICENSE.txt
E:\python\NEWS.txt
E:\python\python-3.7.3-amd64.exe
E:\python\python.exe
E:\python\python3.dll
E:\python\python37.dll
E:\python\pythonw.exe
E:\python\Scripts
E:\python\tcl
E:\python\Tools
E:\python\vcruntime140.dll
例7:
将当前路径下的**文件(注意是文件不是文件夹)**整理成一个列表,
>>> [x for x in p.iterdir() if x.is_file()] # 收集文件是is_file(),收集文件夹用is_dir()
[WindowsPath('E:/python/FishC,txt'), WindowsPath('E:/python/FishC.txt'), WindowsPath('E:/python/LICENSE.txt'), WindowsPath('E:/python/NEWS.txt'), WindowsPath('E:/python/python-3.7.3-amd64.exe'), WindowsPath('E:/python/python.exe'), WindowsPath('E:/python/python3.dll'), WindowsPath('E:/python/python37.dll'), WindowsPath('E:/python/pythonw.exe'), WindowsPath('E:/python/vcruntime140.dll')]
3.绝对路径 vs 相对路径(路径修改)
例8:
>>> n = p / "FishC"
>>> n.mkdir() # 创建文件夹
>>> n.mkdir() # 已有文件夹再次创建会报错
Traceback (most recent call last):
File "", line 1, in
n.mkdir()
File "E:\python\lib\pathlib.py", line 1251, in mkdir
self._accessor.mkdir(self, mode)
FileExistsError: [WinError 183] 当文件已存在时,无法创建该文件。: 'E:\\python\\FishC'
>>> n.mkdir(exist_ok=True) # 加上exist_ok=True,尽管文件已有但不会报错
例9:
FishC里面创建了多个多个文件夹A、B、C。
>>> n=p / "FishC/A/B/C" # 如果路径中有多个不存在的父级目录,也会报错
>>> n.mkdir(exist_ok=True)
Traceback (most recent call last):
File "", line 1, in
n.mkdir(exist_ok=True)
File "E:\python\lib\pathlib.py", line 1251, in mkdir
self._accessor.mkdir(self, mode)
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'E:\\python\\FishC\\A\\B\\C'
>>> n.mkdir(parents=True,exist_ok=True) # 为了解决上述情况,将parents设置为true
>>>
例10:
>>> f=n.open("w")
>>> f.write("I love FishC.")
13
>>> f.close()
>>> n.rename("NewFishC.txt") # 修改文件或文件夹的名字,只修改名字没有修改路径,文件会到python大本营路径下
>>> m=Path("NewFishC.txt")
>>> m
WindowsPath('NewFishC.txt')
>>> n
WindowsPath('E:/python/FishC/A/B/C/FishC.txt')
>>> m.replace(n) # 替换指定的文件夹或文件夹。
例11:
rmdir() 删除文件夹
unlink() 删除文件
>>> n.parent.rmdir() # 删除FishC下的C文件夹,文件夹不为空时不会随意删除,因此报错。
Traceback (most recent call last):
File "", line 1, in
n.parent.rmdir()
File "E:\python\lib\pathlib.py", line 1295, in rmdir
self._accessor.rmdir(self)
OSError: [WinError 145] 目录不是空的。: 'E:\\python\\FishC\\A\\B\\C'
>>> n.unlink() # 删除C文件夹下的文件
>>> n.parent.rmdir() # 删除后,跳回到B文件夹。
4.绝对路径 vs 相对路径(查找功能)
例12:
>>> p=Path('.') # 相对目录,点'.'就是python大本营。
>>> p.glob("*.txt") # 功能强大的查找功能,查找当前文件夹下所有以.txt为后缀的文件。
>>> list(p.glob("*.txt")) # 变成一个列表的形式输出
[WindowsPath('FishC.txt'), WindowsPath('LICENSE.txt'), WindowsPath('NEWS.txt')]
代码注释:
list(p.glob(“/.py”)) 查找当前目录中的所有.py后缀的文件,有68行,这里不展开
list(p.glob(“**/*.py”)) 查找当前目录以及该目录下面的所有子目录,可以使用两个星号 **来表示,一共1562行。