Python pathlib 模块

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 对象来说,它包含非常多的属性,常用的如下表所示。

Path 对象的属性
属性 说明
stem 获取文件名
suffix 获取后缀名
name 获取文件名 + 后缀名
suffixes 获取后缀名列表
parent 上级目录
parents 上级目录列表

为了测试后面的示例,接下来需要在 data 文件夹中创建一个 book.txt,整个目录结构如下图所示。

Python pathlib 项目结构 1

示例 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,整个项目结构如下图所示。

Python pathlib 项目结构 2

示例 2:改变文件名

from pathlib import Path

p = Path('img/logo.png')
p.rename('img/leaf.png')

运行之后,logo.png 就被改为 leaf.png 了,如下图所示。

Python pathlib 改变文件名

示例 3:改变后缀名

from pathlib import Path

p = Path('img/leaf.png')
p.rename('img/leaf.jpg')

运行之后,leaf.png 就被改为 leaf.jpg 了,如下图所示。

Python pathlib 改变后缀名

Python pathlib 判断路径

在 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: True

Python 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 的文件,然后保证整个项目结构如下图所示。

Python pathlib 项目结构 3

示例 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 文件夹,如下图所示。

Python pathlib 创建目录

分析:

在实际开发中,如果我们要创建的目录有多层(例如 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 文件夹已经被删除了,如下图所示。

Python pathlib 删除目录

示例 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 这个文件已经被删除了,如下图所示。

Python pathlib 删除文件

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

上一篇: Python 写入文件

下一篇: Python os 模块

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号