文件7:文件路径基础

目录

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()  


1. 绝对与相对路径

1.1 绝对路径

绝对路径:绝对路径是指文件在硬盘上真正存在的路径。

在 Windows 系统中,绝对路径是以磁盘名称开头,如 C: 或者 D: ,具体的文件或文件夹名称做结尾。绝对路径是唯一的,只有一个。

绝对路径是唯一的,只有一个。

注意转义字符对路径的干扰,需要使用 r'' 原始字符串,或者 '\\' 代替 '\' 。

示例:

'1.txt' 存放 'C:\Users\15063\Desktop' 路径目录下

'1.txt' 的绝对路径即: 'C:\Users\15063\Desktop\1.txt' 

1.2 相对路径

相对路径:相对于自己的目标文件位置。

相对路径是针对当前文件夹这一参考对象,来描述文件路径的形式,使用..\\ 或.\\表示。

'.' 表示文件或文件夹所在的当前目录,可以使用 '.\' 打开本级目录下的文件或目录,也可以直接省略;两个点 '..\' 表示当前目录的上一级目录,上n级就用n个 '.' 表示。

示例:

文件路径如下图

文件7:文件路径基础_第1张图片

文件FB1访问FB2相对路径:'文件FB2' 或者 '.\文件FB2'

文件FB2访问FB11相对路径:'文件夹B1\文件FB11' 或者 '.\文件夹B1\文件FB11'

文件FA1访问FB11相对路径:'..\文件夹B\文件夹B1\文件FB11'

文件FB11访问文件FA1相对路径:'...\文件夹A\文件FA1'

1.3 两者区别

绝对路径和相对路径的区别,可以如下描述:

  • 绝对路径是一个文件实际存在于硬盘中的路径。
  • 相对路径,指的是与自身的目标档案相关的位置。
  • 绝对路径是指可以从这个路径上查找文件夹,不管是从外部或内部存取。而相对路径则是与它本身相关的,其它地方的档案和路径,则只能在内部存取。

2. pathlib模块

2.1 模块概述

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 则在如下情况中较为常用,比如:  

  • 如果要在 Unix 设备上操作 Windows 路径(反之亦然),不可以在 Unix 上实例化一个 WindowsPath,但可以实例化一个 PureWindowsPath。
  • 如果只想操作路径,而不想实际访问操作系统,实例化一个 PurePath 可以防止执行任何访问操作系统的操作。  

2.2. pathlib 与 os 模块的映射关系  

以下是 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() 则没有这个要求。

3. 路径对象

3.1 路径实例化

有三种方法可以实例化具体路径: 

#PurePath 子类,以当前操作系统的路径风格表示路径(实例化为 PosixPath 或 WindowsPath)
class pathlib.Path(*pathsegments)  

#Path 和 PurePosixPath 的子类,表示一个非 Windows 文件系统的具体路径
class pathlib.PosixPath(*pathsegments)  

#Path 和 PureWindowsPath 的子类,表示一个 Windows 文件系统的具体路径
class pathlib.WindowsPath(*pathsegments)  

每一个 pathsegments 参数,可以是一个代表路径片段的字符串,或者是一个实现了 os.PathLike 接口的对象返回的字符串,或者是另外一个路径对象;

  • 当参数为空的时候,则假定为当前目录: 
  • 当参数中包含多个路径字符串,相对路径与前方最近一个绝对路径合并,并采用最后一个合并后的绝对路径; 
  • 当参数中只有相对路径,则相对路径按顺序合并;
  • 在 Windows 路径中,如输入多个路径中,最后一个绝对路径没有盘符,则以最近一个有盘符的绝对路径为输出路径的盘符;

上述绝对路径指以盘符或 '\' 为开头的路径字符串,如:'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')

3.2 路径可哈希

生成的路径是不可变的,且可哈希的。可对路径做排序和比较(根据对应操作系统风格来决定是否区分大小写);可将路径作为字典的键和集合的元素。

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

3.3 路径拼接:'\' 运算符

斜杠(/)运算符用于创建子路径,就像 os.path.join() 一样;

拼接项目中必须有一项为路径对象,其他项可以为字符串;

拼接规则可参考2.1中 Path() 拼接规则如下;

  • 当拼接项目中包含多个路径字符串,相对路径与前方最近一个绝对路径合并,并采用最后一个合并后的绝对路径; 
  • 当拼接项目中只有相对路径,则相对路径按顺序合并;
  • 在 Windows 路径中,如输入多个路径中,最后一个绝对路径没有盘符,则以最近一个有盘符的绝对路径为输出路径的盘符;

如只有字符串,或有整型、列表等其他类型值参与运算,则报错。

#路径对象与字符串拼接
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'

3.4 路径获取

classmethod Path.cwd()  

返回一个新的表示当前目录的路径对象(和 os.getcwd() 相同)。

Path.cwd()
WindowsPath('E:/David/Code/python/代码')

classmethod Path.home()  

返回一个表示用户主目录的新路径对象(与带 ~ 构造的 os.path.expanduser() 所返回的结果相同)。如果无法解析用户主目录,则抛出 RuntimeError 异常。  

Path.home()
WindowsPath('C:/Users/david')

你可能感兴趣的:(Python学习,#,文件,python,开发语言)