Python pathlib 模块简介
在自动化任务中,我们经常需要对大量文件和大量路径进行操作,此时就得借助 pathlib 和 os 这两个模块了。其中,pathlib 模块主要是操作路径,而 os 模块主要是操作文件或文件夹。
在 Python 3.4 之前,凡是涉及路径的操作,我们都是使用 os 模块来实现的。不过在 Python 3.4 之后,pathlib 成为标准库模块。此后对于路径的操作,Python 官方都建议使用 pathlib 模块。
pathlib 模块有两个主要的类:PurePath 和 Path。在实际项目开发中,一般使用的是 Path 这个类。
语法:
from pathlib import Path
p = Path(path)说明:
Path() 返回一个 Path 对象,该对象包含比较多的属性和方法。Path 本身是一个类,它也有非常多的静态方法。
Path 对象的基本属性
对于 Path 对象来说,它包含非常多的属性,常用的如下表所示。
| 属性 | 说明 |
|---|---|
| stem | 获取文件名 |
| suffix | 获取后缀名 |
| name | 获取文件名 + 后缀名 |
| suffixes | 获取后缀名列表 |
| parent | 上级目录 |
| parents | 上级目录列表 |
为了测试后面的示例,接下来需要在 data 文件夹中创建一个 book.txt,整个目录结构如下图所示。

示例 1:Path 对象的属性
from pathlib import Path
p = Path('data/book.txt')
print('stem:', p.stem)
print('suffix:', p.suffix)
print('name: ', p.name)
print('suffixes: ', p.suffixes)
print('parent: ', p.parent)
print('parents: ', p.parents)运行结果如下。
stem: book
suffix: .txt
name: book.txt
suffixes: ['.txt']
parent: data
parents: <WindowsPath.parents>Python pathlib 实现 “重命名”
在 pathlib 模块中,我们可以使用 rename() 方法来对一个文件进行重新命名。rename() 方法除了可以改变文件名之外,还可以改变文件的后缀名。
语法:
object.rename(target)说明:
object 是一个 Path 对象,target 是一个包含新文件名的路径。我们在当前项目下新建一个名为 “img” 的文件夹,并且往该文件夹中放入一张图片:logo.png,整个项目结构如下图所示。

示例 2:改变文件名
from pathlib import Path
p = Path('img/logo.png')
p.rename('img/leaf.png')运行之后,logo.png 就被改为 leaf.png 了,如下图所示。

示例 3:改变后缀名
from pathlib import Path
p = Path('img/leaf.png')
p.rename('img/leaf.jpg')运行之后,leaf.png 就被改为 leaf.jpg 了,如下图所示。

Python pathlib 判断路径
在 pathlib 模块中,判断路径的方法如下表所示。
| 方法 | 说明 |
|---|---|
| is_file() | 是否为一个文件 |
| is_dir() | 是否为一个目录(即文件夹) |
| is_absolute() | 是否为一个绝对路径 |
| exists() | 路径是否存在 |
示例 4:pathlib 判断路径
from pathlib import Path
p = Path('data/book.txt')
print('is_file:', p.is_file())
print('is_dir:', p.is_dir())
print('is_absolute:', p.is_absolute())
print('exists:', p.exists())运行结果如下。
is_file: True
is_dir: False
is_absolute: False
exists: TruePython pathlib 拼接路径
在 pathlib 模块中,我们可以使用 joinpath() 方法来将两个或多个路径拼接到一起,然后组成一个新的路径。
语法:
object.joinpath(path1, path2, ... , pathN )说明:
这里的路径可以是相对路径,也可以是绝对路径。两个路径之间使用英文逗号隔开。如果你了解文件路径,请查看:Python 文件路径。
示例 5:pathlib 拼接路径
from pathlib import Path
p = Path(r'D:\python-test')
result = p.joinpath('data', 'book.txt')
print(result)运行结果如下。
D:\python-test\data\book.txt分析:
对于上面示例来说,下面 2 种方式是等价的。
# 方式 1
p.joinpath('data', 'book.txt')
# 方式 2
p.joinpath('data/book.txt')在实际项目开发中,一般都不知道当前工作目录是什么,但又想获取当前工作目录下的某些文件的完整路径,此时你就可以使用 Path.cwd() 结合 joinpath() 来实现了,请看下面示例。
示例 6:Path.cwd() 结合 joinpath()
from pathlib import Path
p = Path.cwd()
result = p.joinpath('img/logo.png')
print(result)运行结果如下。
D:\python-test\img\logo.png分析:
Path.cwd() 获取的是当前的工作路径,它与后面介绍的 os.getcwd() 是等价的,你只需要掌握其中一个即可。
Python pathlib 创建与删除路径
在 pathlib 模块中,与路径创建或删除相关的方法有 3 个,如下表所示。
| 方法 | 说明 |
|---|---|
| mkdir() | 创建目录 |
| rmdir() | 删除目录,目录必须为空 |
| unlink() | 删除文件 |
在执行后面操作之前,需要在当前项目目录下创建一个名为 test.txt 的文件,然后保证整个项目结构如下图所示。

示例 7:创建目录
from pathlib import Path
p = Path(r'D:\python-test\data')
# 定义函数
def create_dir(p):
if p.exists():
print('目录已存在!')
else:
p.mkdir()
# 调用函数
create_dir(p)运行之后,当前项目目录下多了一个 data 文件夹,如下图所示。

分析:
在实际开发中,如果我们要创建的目录有多层(例如 Path('D:/a/b/c')),并且中间的文件夹都不存在,直接调用 mkdir() 会报错。不过 pathlib 为我们提供了一个非常优雅的终极写法:
p.mkdir(parents=True, exist_ok=True)其中,parents=True 表示如果中间的父文件夹不存在,会自动帮你一起创建。
而 exist_ok=True 表示如果该文件夹已经存在了,程序也不会报错。这种一行代码搞定的方式,比写 if...else 判断要强大得多!
示例 8:删除目录
from pathlib import Path
p = Path(r'D:\python-test\data')
# 定义函数
def del_dir(p):
if p.exists():
p.rmdir()
else:
print('目录不存在!')
# 调用函数
del_dir(p)运行之后,当前项目目录下的 data 文件夹已经被删除了,如下图所示。

示例 9:删除文件
from pathlib import Path
p = Path(r'D:\python-test\test.txt')
# 定义函数
def del_file(p):
if p.exists():
p.unlink()
else:
print('文件不存在!')
# 调用函数
del_file (p)运行之后,当前项目目录下的 test.txt 这个文件已经被删除了,如下图所示。

思考: 现在小伙伴们已经知道如何创建目录、删除目录以及删除文件,那么如何创建一个文件呢?(提示:使用 open() 函数以 “w” 模式打开,如果文件不存在,就会自动创建)
