目录
1. 绝对与相对路径
1.1 绝对路径
1.2 相对路径
1.3 两者区别
2. pathlib模块
2.1 模块概述
2.2. pathlib 与 os 模块的映射关系
3. 路径对象
3.1 路径实例化
3.2 路径可哈希
3.3 路径拼接:'\' 运算符
3.4 路径获取
classmethod Path.cwd()
classmethod Path.home()
绝对路径:绝对路径是指文件在硬盘上真正存在的路径。
在 Windows 系统中,绝对路径是以磁盘名称开头,如 C: 或者 D: ,具体的文件或文件夹名称做结尾。绝对路径是唯一的,只有一个。
绝对路径是唯一的,只有一个。
注意转义字符对路径的干扰,需要使用 r'' 原始字符串,或者 '\\' 代替 '\' 。
示例:
'1.txt' 存放 'C:\Users\15063\Desktop' 路径目录下
'1.txt' 的绝对路径即: 'C:\Users\15063\Desktop\1.txt'
相对路径:相对于自己的目标文件位置。
相对路径是针对当前文件夹这一参考对象,来描述文件路径的形式,使用..\\ 或.\\表示。
'.' 表示文件或文件夹所在的当前目录,可以使用 '.\' 打开本级目录下的文件或目录,也可以直接省略;两个点 '..\' 表示当前目录的上一级目录,上n级就用n个 '.' 表示。
示例:
文件路径如下图
文件FB1访问FB2相对路径:'文件FB2' 或者 '.\文件FB2'
文件FB2访问FB11相对路径:'文件夹B1\文件FB11' 或者 '.\文件夹B1\文件FB11'
文件FA1访问FB11相对路径:'..\文件夹B\文件夹B1\文件FB11'
文件FB11访问文件FA1相对路径:'...\文件夹A\文件FA1'
绝对路径和相对路径的区别,可以如下描述:
pathlib 为 Python3.4 后新增模块,提供表示文件系统路径的类,完美代替 os.path 模块;
路径类可分为提供纯计算操作而不涉及 I/O 的 PurePath,以及从 PurePath 继承而来但提供 I/O 操作的子类 Path;
Path 除了拥有 PurePath 提供的路径操作之外,还提供对路径对象进行系统调用的方法,通常编码直接调用Path函数即可,从 pathlib 中单独导入Path函数类,如下:
>>> from pathlib import Path
导入pathlib模块中的Path类,其中有一系列常用方法和属性,可实现获取当前路径、检测路径是否存在、拆分路径为元组、创建文件夹、修改文件夹或文件名、删除文件夹或文件、查找等操作;
后续文件路径方法,都基于 Path 类展开。
PurePath 则在如下情况中较为常用,比如:
以下是 os 模块与 PurePath / Path 模块对应功能的函数映射表:
注意:并非所有的函数、方法完全等价,它们有些虽然具有相互重叠的使用场景,但语义并不相同。这包括了 os.path.abspath() 和 Path.resolve(),以及 os.path.relpath() 和 PurePath.relative_to() 等。
os 和 os.path |
pathlib |
os.path.abspath() |
Path.resolve(),见注1 |
os.chmod() |
Path.chmod() |
os.mkdir() |
Path.mkdir() |
os.makedirs() |
Path.mkdir() |
os.rename() |
Path.rename() |
os.replace() |
Path.replace() |
os.rmdir() |
Path.rmdir() |
os.remove(),os.unlink() |
Path.unlink() |
os.getcwd() |
Path.cwd() |
os.path.exists() |
Path.exists() |
os.path.expanduser() |
Path.expanduser() 和 Path.home() |
os.listdir() |
Path.iterdir() |
os.path.isdir() |
Path.is_dir() |
os.path.isfile() |
Path.is_file() |
os.path.islink() |
Path.is_symlink() |
os.link() |
Path.hardlink_to() |
os.symlink() |
Path.symlink_to() |
os.readlink() |
Path.readlink() |
os.path.relpath() |
Path.relative_to(),见注2 |
os.stat() |
Path.stat(),Path.owner(),Path.group() |
os.path.isabs() |
PurePath.is_absolute() |
os.path.join() |
PurePath.joinpath() |
os.path.basename() |
PurePath.name |
os.path.dirname() |
PurePath.parent |
os.path.samefile() |
Path.samefile() |
os.path.splitext() |
PurePath.suffix |
注1:os.path.abspath() 不会解析符号链接而 Path.resolve() 则会解析。
注2:Path.relative_to() 要求 self 为参数的子路径,但 os.path.relpath() 则没有这个要求。
有三种方法可以实例化具体路径:
#PurePath 子类,以当前操作系统的路径风格表示路径(实例化为 PosixPath 或 WindowsPath)
class pathlib.Path(*pathsegments)
#Path 和 PurePosixPath 的子类,表示一个非 Windows 文件系统的具体路径
class pathlib.PosixPath(*pathsegments)
#Path 和 PureWindowsPath 的子类,表示一个 Windows 文件系统的具体路径
class pathlib.WindowsPath(*pathsegments)
每一个 pathsegments 参数,可以是一个代表路径片段的字符串,或者是一个实现了 os.PathLike 接口的对象返回的字符串,或者是另外一个路径对象;
上述绝对路径指以盘符或 '\' 为开头的路径字符串,如:'E:\David\Code.py' 、'\David\Code.py';
上述相对路径指以 '.' 或文件夹名、文件名为开头的路径字符串,如:'.' 、 '..\Code.py' 、 'Code\' 、 'Code.py'等等。
生成的路径中,'\'、'\\' 会被替换为单斜杠 '/' ,表示当前文件夹的点号斜杠 '.\' 会被去除,双点号斜杠 '..\' 则不会,以防改变路径的含义。
from pathlib import Path
#绝对路径字符串转换
p = Path('E:\David\Code\python\代码')
p
WindowsPath('E:/David/Code/python/代码')
#相对路径字符串转换
p = Path('textx.txt')
p
WindowsPath('textx.txt')
#参数为空,生成默认当前文件夹的相对路径 '.'
p3 = Path()
p3
WindowsPath('.')
#当参数中包含多个绝对、相对路径,相对路径与前方最近一个绝对路径合并,并采用最后一个合并后的绝对路径
p = Path('D:\\','文件\\text.txt','F:\\A','E:\\David\\Code\\python\\代码','text.txt')
p
WindowsPath('E:/David/Code/python/代码/text.txt')
p = Path('E:\\David\\Code','python\\代码','F:\\A','text.txt','D:\\','文件\\','text.txt')
p
WindowsPath('D:/文件/text.txt')
p = Path('\\a\\b\\c.txt','\\d\\e','f.txt')
p
WindowsPath('/d/e/f.txt')
#当参数中只有相对路径,则相对路径按顺序合并
p = Path('a.txt','b.txt')
p
WindowsPath('a.txt/b.txt')
#在 Windows 路径中,如输入多个路径中,最后一个绝对路径没有盘符,则以最近一个有盘符的绝对路径为输出路径的盘符
p = Path('D:\\a\\b\\','C:\\x.txt','F:\\d\\','y.py','\\e\\f\\z.doc')
p
WindowsPath('F:/e/f/z.doc')
#生成的路径中,'\'、'\\' 会被替换为单斜杠 '/'
p = Path('C:\\a/b\c.txt')
p
WindowsPath('C:/a/b/c.txt')
#表示当前文件夹的点号斜杠 '.\' 会被去除
p = Path(r'.\a.txt')
p
WindowsPath('a.txt')
#双点号斜杠 '..\' 则不会,以防改变路径的含义
p = Path(r'..\a.txt')
p
WindowsPath('../a.txt')
生成的路径是不可变的,且可哈希的。可对路径做排序和比较(根据对应操作系统风格来决定是否区分大小写);可将路径作为字典的键和集合的元素。
d = {Path('..\\a.txt'):1234,Path('C:\\文件夹\\'):'5678'}
d
{WindowsPath('../a.txt'): 1234, WindowsPath('C:/文件夹'): '5678'}
Path('..\\a.txt') in d
True
Path('..\\a.txt') == Path(r'..\a.txt')
True
斜杠(/)运算符用于创建子路径,就像 os.path.join() 一样;
拼接项目中必须有一项为路径对象,其他项可以为字符串;
拼接规则可参考2.1中 Path() 拼接规则如下;
如只有字符串,或有整型、列表等其他类型值参与运算,则报错。
#路径对象与字符串拼接
p = Path('C:/') / '文件夹\\' / 'test.txt'
p
WindowsPath('C:/文件夹/test.txt')
#拼接规则测试
p = Path('.\\x.txt') / '\\文件夹\\' / Path('C:/')
p
WindowsPath('C:/')
p = Path('.\\x.txt') / '文件夹\\'
p
WindowsPath('x.txt/文件夹')
p = Path('.\\x.txt') / Path('C:/') / '\\文件夹\\'
p
WindowsPath('C:/文件夹')
#只有字符串做拼接,报错
p = '文件夹\\' / 'test.txt'
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for /: 'str' and 'str'
#路径与列表、整型数据拼接,报错
p = Path('C:/') / ['a','b','c']
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for /: 'WindowsPath' and 'list'
p = Path('C:/') / 1234
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for /: 'WindowsPath' and 'int'
返回一个新的表示当前目录的路径对象(和 os.getcwd() 相同)。
Path.cwd()
WindowsPath('E:/David/Code/python/代码')
返回一个表示用户主目录的新路径对象(与带 ~ 构造的 os.path.expanduser() 所返回的结果相同)。如果无法解析用户主目录,则抛出 RuntimeError 异常。
Path.home()
WindowsPath('C:/Users/david')