购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.1 路径操作

路径描述的是文件夹或文件在计算机中存放的位置,又分为绝对路径和相对路径。绝对路径是指以根文件夹为起点的完整路径,Windows系统以“C:\”“D:\”等作为根文件夹,Linux和macOS系统以“/”作为根文件夹。相对路径是指相对于当前工作目录(即当前运行的“.py”文件所在的文件夹)的路径。例如,假设当前运行的“.py”文件位于文件夹“F:\python\第1章”下,该文件夹下还有一个工作簿“供应商信息表.xlsx”,那么该工作簿的绝对路径为“F:\python\第1章\供应商信息表.xlsx”,相对路径为“供应商信息表.xlsx”。

pathlib模块提供的路径操作包括路径的获取、分解、拼接、修改等。需要注意的是,路径操作只针对路径对象本身,并不会影响硬盘上实际存在的文件夹或文件。通过路径对象对文件夹或文件执行实际操作的内容将在1.2节讲解。

1.1.1 Path对象——创建路径对象

在pathlib模块中,要执行关于路径、文件夹和文件的操作,首先需要创建一个路径对象,最基本的方法是使用Path对象来创建路径对象。其语法格式如下:

pathlib.Path(path_string)

参数说明:

path_string:一个以字符串形式给出的路径,可以是绝对路径或相对路径。Windows系统中路径的分隔符是“\”,该字符在Python中有特殊含义,因此,在Python代码中书写Windows路径字符串有一定的讲究。具体来说,可以用“\\”或“/”代替“\”,也可以为路径字符串加上字母r的前缀,演示代码如下:


1 'F:\\python\\第1章\\供应商信息表.xlsx'
2 'F:/python/第1章/供应商信息表.xlsx'
3 r'F:\python\第1章\供应商信息表.xlsx'

以上列出了路径字符串的3种书写格式,读者可根据自己的习惯任意选用一种。本书主要使用第1种书写格式。

应用场景 创建一个绝对路径对象

◎代码文件:Path对象.py

本案例要创建一个绝对路径对象,指向文件夹“F:\python\第1章”中的工作簿“供应商信息表.xlsx”,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 p = Path('F:\\python\\第1章\\供应商信息表.xlsx') # 创建一个绝对路径对象
3 print(p) # 输出创建的绝对路径对象

代码运行结果如下:


1 F:\python\第1章\供应商信息表.xlsx

1.1.2 cwd()函数和home()函数——获取特殊路径

pathlib模块中的cwd()函数用于获取当前工作目录的绝对路径对象,home()函数用于获取当前用户文件夹的绝对路径对象。这两个函数的语法格式如下:

pathlib.Path.cwd/home()

应用场景 获取当前工作目录和用户文件夹的绝对路径对象

◎代码文件:cwd()函数和home()函数.py

假设当前操作系统是Windows 10,登录的用户名为“Eason”。启动PyCharm,创建一个新项目,项目文件夹为“F:\python\第1章”,在项目文件夹下新建代码文件“cwd()函数和home()函数.py”,然后在代码文件中输入如下代码:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 p1 = Path.cwd() # 获取当前工作目录的绝对路径对象
3 p2 = Path.home() # 获取当前用户文件夹的绝对路径对象
4 print(p1) # 输出当前工作目录的绝对路径对象
5 print(p2) # 输出当前用户文件夹的绝对路径对象

代码运行结果如下:


1 F:\python\第1章
2 C:\Users\Eason

1.1.3 parts属性——分解路径

路径对象的parts属性用于按照路径分隔符分解路径。其语法格式如下:

表达式.parts

参数说明:

表达式:一个路径对象。

利用parts属性分解路径得到的各组成部分是一个个字符串,并且会存储在一个元组中返回。再通过“元组[索引号]”的方式提取元组的单个元素,就能得到路径的某个部分。

应用场景 分解指定路径并提取路径的某个部分

◎代码文件:parts属性.py

本案例要使用parts属性对路径“F:\python\第1章\供应商信息表.xlsx”进行分解,并提取路径的第1部分(即“F:\”)和第3部分(即“第1章”),演示代码如下:


1 from pathlib import Path  # 导入pathlib模块中的Path对象
2 p = Path('F:\\python\\第1章\\供应商信息表.xlsx')  # 指定要分解的路径
3 p_part = p.parts  # 获取路径的各个组成部分
4 a = p_part[0]  # 提取元组的第1个元素,即路径的第1部分
5 b = p_part[2]  # 提取元组的第3个元素,即路径的第3部分
6 print(p_part)  # 输出路径的各个组成部分
7 print(a)  # 输出路径的第1部分
8 print(b)  # 输出路径的第3部分

代码运行结果如下:


1 ('F:\\', 'python', '第1章', '供应商信息表.xlsx')
2 F:\
3 第1章

1.1.4 parent属性和parents属性——获取上级路径

路径对象的parent属性和parents属性用于从指定路径中提取上级路径。其语法格式如下:

表达式.parent/parents

参数说明:

表达式:一个路径对象。

parent属性仅返回指定路径的上一级路径。parents属性则会返回一个序列,其中包含所有层级的上级路径,可以通过索引号来提取指定级数的上级路径,如下图所示。

应用场景1 用parent属性提取指定路径的上级路径

◎代码文件:parent属性.py

本案例要使用parent属性从路径“F:\python\第1章\供应商信息表.xlsx”中提取上级路径,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 p = Path('F:\\python\\第1章\\供应商信息表.xlsx') # 指定一个路径
3 file_parent1 = p.parent # 提取指定路径的上一级路径
4 file_parent2 = p.parent.parent # 提取指定路径的上二级路径
5 file_parent3 = p.parent.parent.parent # 提取指定路径的上三级路径
6 print(file_parent1) # 输出提取的上一级路径
7 print(file_parent2) # 输出提取的上二级路径
8 print(file_parent3) # 输出提取的上三级路径

代码运行结果如下:


1 F:\python\第1章
2 F:\python
3 F:\

应用场景2 用parents属性提取指定路径的上级路径

◎代码文件:parents属性1.py

本案例要使用parents属性从路径“F:\python\第1章\供应商信息表.xlsx”中提取全部上级路径,然后用索引号提取指定级数的上级路径,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 p = Path('F:\\python\\第1章\\供应商信息表.xlsx') # 指定一个路径
3 file_parent1 = p.parents[0] # 提取指定路径的上一级路径
4 file_parent2 = p.parents[1] # 提取指定路径的上二级路径
5 file_parent3 = p.parents[2] # 提取指定路径的上三级路径
6 print(file_parent1) # 输出提取的上一级路径
7 print(file_parent2) # 输出提取的上二级路径
8 print(file_parent3) # 输出提取的上三级路径

代码运行结果如下:


1 F:\python\第1章
2 F:\python
3 F:\

应用场景3 用parents属性提取指定路径的上级路径

◎代码文件:parents属性2.py

本案例要使用parents属性从路径“F:\python\第1章\供应商信息表.xlsx”中提取全部上级路径,然后用for语句依次提取各个级数的上级路径,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 p = Path('F:\\python\\第1章\\供应商信息表.xlsx') # 指定一个路径
3 file_parent = p.parents # 提取指定路径的全部上级路径
4 for i in file_parent: # 遍历提取的上级路径
5     print(i) # 依次输出各个级数的上级路径

代码运行结果如下:


1 F:\python\第1章
2 F:\python
3 F:\

1.1.5 name属性和stem属性——获取文件全名、文件主名和文件夹名

路径对象的name属性和stem属性用于提取路径的最后一个部分,并返回一个字符串。两者的区别是如果最后一个部分包含扩展名,stem属性会将扩展名删除。其语法格式如下:

表达式.name/stem

参数说明:

表达式:一个路径对象。

具体到实际应用,如果路径指向的是一个文件,那么name属性提取的是文件全名(即包含扩展名的文件名),stem属性提取的则是文件主名(即不包含扩展名的文件名);如果路径指向的是一个文件夹,那么由于文件夹名通常没有扩展名,name属性和stem属性的提取结果相同,都是文件夹名。

应用场景 从路径中提取文件全名、文件主名和父文件夹名

◎代码文件:name属性和stem属性.py

假设有路径“F:\python\第1章\供应商信息表.xlsx”,现在要从该路径中提取工作簿“供应商信息表.xlsx”的文件全名、文件主名和父文件夹名,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 p = Path('F:\\python\\第1章\\供应商信息表.xlsx') # 指定一个路径
3 file_name = p.name # 提取文件全名
4 file_stem = p.stem # 提取文件主名
5 folder_name = p.parent.name # 先提取父文件夹路径,再提取父文件夹名
6 folder_stem = p.parent.stem # 先提取父文件夹路径,再提取父文件夹名
7 print(file_name) # 输出提取的文件全名
8 print(file_stem) # 输出提取的文件主名
9 print(folder_name) # 输出提取的文件夹名
10 print(folder_stem) # 输出提取的文件夹名

上述代码的工作原理如下图所示。

代码运行结果如下:


1 供应商信息表.xlsx
2 供应商信息表
3 第1章
4 第1章

1.1.6 suffix属性和suffixes属性——获取文件扩展名

路径对象的suffix属性和suffixes属性用于从路径的最后一个部分中提取扩展名,前者返回的是一个字符串,后者返回的则是一个列表。其语法格式如下:

表达式.suffix/suffixes

参数说明:

表达式:一个路径对象。

具体到实际应用,如果路径指向的是一个文件,并且该文件只有一个扩展名,那么suffix属性会返回该扩展名的字符串,而suffixes属性返回的是一个列表,列表中只有一个元素,即该扩展名的字符串;如果路径指向的文件有多个扩展名(Linux和macOS中较为多见),那么suffix属性会返回最后一个扩展名的字符串,而suffixes属性返回的是一个列表,列表中的元素是各个扩展名的字符串;如果路径指向的是一个文件夹,那么由于文件夹名通常没有扩展名,suffix属性返回的是一个空字符串,suffixes属性返回的是一个空列表。

应用场景 从路径中提取文件扩展名

◎代码文件:suffix属性和suffixes属性.py

本案例要用suffix属性和suffixes属性从不同形式的路径中提取文件扩展名,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 p1 = Path('F:\\python\\第1章\\供应商信息表.xlsx') # 指定第1个路径
3 file_suffix1 = p1.suffix # 用suffix属性从第1个路径中提取扩展名
4 file_suffixes1 = p1.suffixes # 用suffixes属性从第1个路径中提取扩展名
5 print(file_suffix1) # 输出用suffix属性提取的扩展名
6 print(file_suffixes1) # 输出用suffixes属性提取的扩展名
7 p2 = Path('F:\\python\\第1章\\library.tar.gz') # 指定第2个路径
8 file_suffix2 = p2.suffix # 用suffix属性从第2个路径中提取扩展名
9 file_suffixes2 = p2.suffixes # 用suffixes属性从第2个路径中提取扩展名
10 print(file_suffix2) # 输出用suffix属性提取的扩展名
11 print(file_suffixes2) # 输出用suffixes属性提取的扩展名

代码运行结果如下:


1 .xlsx
2 ['.xlsx']
3 .gz
4 ['.tar', '.gz']

1.1.7 “/”运算符和joinpath()函数——拼接路径

pathlib模块提供了两种拼接路径的工具:“/”运算符和joinpath()函数。下面分别介绍。

“/”运算符的语法格式如下:

path1/path2/path3……

参数说明:

path1,path2,path3……:要拼接成路径的项目,可以为字符串或路径对象,但至少要有一个路径对象。

joinpath()函数的语法格式如下:

表达式.joinpath(path1,path2,path3……)

参数说明:

表达式:一个路径对象。

path1,path2,path3……:要拼接到表达式所代表的路径对象后的项目,可以为字符串或其他路径对象。

应用场景1 用“/”运算符拼接路径

◎代码文件:“/”运算符.py

本案例要使用“/”运算符拼接一个路径,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 path1 = Path('F:\\python') # 指定第1部分
3 path2 = Path('第1章') # 指定第2部分
4 path3 = '员工信息表.xlsx' # 指定第3部分
5 p = path1 / path2 / path3 # 将上述3个部分拼接成一个路径
6 print(p) # 输出拼接后的路径

代码运行结果如下:


1 F:\python\第1章\员工信息表.xlsx

应用场景2 用joinpath()函数拼接路径

◎代码文件:joinpath()函数.py

本案例要使用joinpath()函数拼接一个路径,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 path1 = Path('F:\\python') # 指定第1部分
3 path2 = Path('第1章') # 指定第2部分
4 path3 = '员工信息表.xlsx' # 指定第3部分
5 p = path1.joinpath(path2, path3) # 在第1部分后面依次拼接第2部分和第3部分
6 print(p) # 输出拼接后的路径

代码运行结果如下:


1 F:\python\第1章\员工信息表.xlsx

1.1.8 with_name()函数和with_suffix()函数——更改文件夹名、文件名、扩展名

路径对象的with_name()函数用于将路径的最后一个部分替换为指定的字符串。其语法格式如下:

表达式.with_name(name)

参数说明:

表达式:一个路径对象。

name:用于替换路径最后一个部分的字符串。

如果路径只有一个部分,如Path('F:\\'),则使用with_name()函数时会报错。

具体到实际应用,重命名文件夹或文件时需构造新的路径,此时可用with_name()函数将原路径的最后一个部分替换为新的名称,得到新路径后再传给其他函数,执行重命名操作。

路径对象的with_suffix()函数用于将路径最后一个部分的扩展名替换为指定的字符串。其语法格式如下:

表达式.with_suffix(suffix)

参数说明:

表达式:一个路径对象。

suffix:用于替换路径最后一个部分的扩展名的字符串,必须以“.”开头。如果该参数值为空字符串,则表示将路径的扩展名删除。

如果路径没有扩展名,with_suffix()函数会将新扩展名拼接到路径的尾部。

具体到实际应用,转换文件格式时需构造使用新扩展名的文件路径,此时可用with_suffix()函数将原路径的扩展名替换为新扩展名,得到新路径后再传给其他函数,执行另存为等操作。

应用场景 更改路径中的文件名和扩展名

◎代码文件:with_name()函数和with_suffix()函数.py

本案例要使用with_name()函数和with_suffix()函数分别更改一个路径中的文件名和扩展名,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 p = Path('F:\\python\\第1章\\员工信息表.xlsx') # 指定一个路径
3 p1 = p.with_name('员工档案表.xlsx') # 更改路径中的文件名
4 p2 = p.with_suffix('.xls') # 更改路径中的扩展名
5 print(p1) # 输出更改文件名后的路径
6 print(p2) # 输出更改扩展名后的路径

代码运行结果如下:


1 F:\python\第1章\员工档案表.xlsx
2 F:\python\第1章\员工信息表.xls

1.1.9 is_absolute()函数——判断指定路径是否为绝对路径

路径对象的is_absolute()函数用于判断一个路径是否为绝对路径,如果是绝对路径则返回True,如果是相对路径则返回False。其语法格式如下:

表达式.is_absolute()

参数说明:

表达式:一个路径对象。

应用场景 判断指定的路径是否是绝对路径

◎代码文件:is_absolute()函数.py

本案例要使用is_absolute()函数判断两个路径是否是绝对路径,演示代码如下:


1 from pathlib import Path # 导入pathlib模块中的Path对象
2 p1 = Path('F:\\python\\第1章\\供应商信息表.xlsx') # 指定第1个路径
3 p2 = Path('第1章\\供应商信息表.xlsx') # 指定第2个路径
4 p3 = p1.is_absolute() # 判断第1个路径是否是绝对路径
5 p4 = p2.is_absolute() # 判断第2个路径是否是绝对路径
6 print(p3) # 输出第1个路径的判断结果
7 print(p4) # 输出第2个路径的判断结果

代码运行结果如下,可以看到,函数的判断结果与路径的实际情况相符。 MQ1AQJUYBwOOLDKFLeyRlwcw3EdDL14+nU9gsZ6JLbOZIhCzxDJF4oXBggrs+J87


1 True
2 False
点击中间区域
呼出菜单
上一章
目录
下一章
×