(小甲鱼python)文件永久存储(中)总结 路径处理 pathlib–面向对象的文件系统路径 绝对路径vs相对路径(路径查询、路径修改、查找功能)

一、基础复习

上节课回顾:
1.文件永久存储(上) python文件永久存储(创建打开文件、文件对象的各种方法及含义)

二、路径处理

windows系统使用反斜杠\作为路径分隔符。其他系统使用多使用斜杠

1.路径处理
pathlib – 面向对象的文件系统路径
pathlib 是 Python3.4 之后新添加的模块,它可以让文件和路径操作变得快捷方便,完美代替 os.path 模块。

pathlib该模块提供了用于表示文件系统路径的类,适用于不同的操作系统。路径类被分为提供纯计算操作而不涉及 I/O 的 PurePath,以及从纯路径继承而来但提供 I/O 操作的 Path。

旧版路径: 新旧路径处理模块大比拼(pathlib vs os.path)
常用命令如下:

  • cwd() 获取当前目录的路径
  • is_dir 判断一个路径是否为一个文件夹
  • is_file() 判断一个路径是否为一个文件
  • exists() 检测一个路径是否存在
  • name 获取路径的最后一个部分
  • stem 获取文件名
  • suffix 获取文件后缀
  • parent 获取父级目录
  • parents 获取逻辑祖先路径构成的序列
  • parts 将路径的各个组件拆分元组
  • stat() 查询文件或文件夹的信息

例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都是绝对路径。
相对路径:是以目录作为基准,进行一级一级的这个目录推导的一个路径,我们使用点来表示当前所在的目录,使用两个紧挨着的点来表示上一级目录。

  • resolve() 将相对路径转换为绝对路径。
  • iterdir() 获取当前路径下所有子文件和子文件夹。
  • mkdir() 创建文件夹。
  • open() 打开文件。
  • rename() 修改文件或文件夹的名字
  • replace() 替换指定的文件夹或文件夹。
  • rmdir() 删除文件夹 unlink() 删除文件
  • glob() 功能强大的查找功能

例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()  # 得到了一个生成器
<generator object Path.iterdir at 0x000001D862A3E930>
>>> 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 "<pyshell#28>", line 1, in <module>
    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 "<pyshell#32>", line 1, in <module>
    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 "<pyshell#49>", line 1, in <module>
    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为后缀的文件。
<generator object Path.glob at 0x000001D862A3EA20>
>>> list(p.glob("*.txt"))  # 变成一个列表的形式输出
[WindowsPath('FishC.txt'), WindowsPath('LICENSE.txt'), WindowsPath('NEWS.txt')]

代码注释:
list(p.glob(“/.py”)) 查找当前目录中的所有.py后缀的文件,有68行,这里不展开
list(p.glob(“**/*.py”)) 查找当前目录以及该目录下面的所有子目录,可以使用两个星号 **来表示,一共1562行。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值