pathlib 是 Python 的一个标准库,它提供了一个面向对象的文件系统路径操作接口。使用 pathlib,你可以以一种更直观和更易于理解的方式处理文件路径,而不必使用字符串操作来分割和连接路径。
os模块 vs pathlib
在Python 3.4之前,处理文件路径的更传统的方法是使用os模块。
我们可以通过考虑数据科学中的一个常见任务来展示pathlib的独特价值:如何找到给定目录及其所有子目录中的所有png文件。
如果我们使用的是os模块,我们可能会编写以下代码:
import os
dir_path = "/home/user/documents"
files = [
os.path.join(dir_path, f)
for f in os.listdir(dir_path)
if os.path.isfile(os.path.join(dir_path, f)) and f.endswith(".png")
]
虽然这段代码解决了查找png文件的即时任务,但它揭示了os模块的几个主要缺点。首先,代码很长,几乎不可读,这是一个遗憾,考虑到这是一个相对简单的操作。第二点,我们的代码假设了列表解析的知识,这不应该被认为是理所当然的。第三点,代码涉及字符串操作,这是容易出错的。最重要的是,代码不是很简洁。
相反,如果我们使用pathlib模块,我们的代码会简单得多。正如我们所提到的,pathlib提供了一种面向对象的方法来处理文件系统路径。
from pathlib import Path# Create a path object
dir_path = Path(dir_path)# Find all text files inside a directory
files = list(dir_path.glob("*.png"))
这种面向对象的编程围绕对象及其交互来组织代码,从而产生更多的模块化、可重用和可维护的代码。
在Python中使用Path对象
pathlib库围绕所谓的Path对象展开,paths对象是一种以结构化和 平台独立的方式。
我们使用以下代码行将Path类从pathlib模块引入到当前的命名空间中:
from pathlib import Path
从pathlib调用Path类后,我们可以通过多种方式创建Path对象,包括从字符串、从其他Path对象、从当前工作目录和从主目录。
从字符串创建路径对象
我们可以通过将表示文件系统路径的字符串传递给变量来创建Path对象。这将文件路径的字符串表示形式转换为Path对象。
file_path_str = "data/union_data.csv"data_path = Path(file_path_str)
从其他路径对象创建
现有的Path对象可以用作创建新路径的构建块。
我们通过将基本路径、数据目录和文件名组合成一个文件路径来实现这一点。我们必须记住在适当的地方使用正斜杠来扩展Path对象。
base_path = Path("/home/user")
data_dir = Path("data")# Combining multiple paths
file_path = base_path / data_dir / "prices.csv"
print(file_path)
输出
'/home/user/data/prices.csv'
从当前工作目录创建路径对象
这里我们使用Path.cwd()方法将当前工作目录分配给cwd变量。然后,我们可以检索脚本运行的当前工作目录的路径。
cwd = Path.cwd()print(cwd)
输出
'/home/bexgboost/articles/2024/4_april/8_pathlib'
从主工作目录创建路径对象
我们可以通过将主目录与其他子目录组合来构造路径。在这里,我们将主目录与子目录“downloads”和“projects”合并。"
home = Path.home()home / "downloads" / "projects"
重要提示:Path类本身不执行任何文件系统操作,如路径验证、创建目录或文件。它被设计用于表示和操作路径。要与文件系统进行实际交互(检查是否存在,阅读/写入文件),我们必须使用Path对象的特殊方法,对于某些高级情况,请从os模块获得帮助。
在Python中使用Path组件
文件路径属性是文件路径的各种属性和组件,有助于识别和管理文件系统中的文件和目录。就像物理地址有不同的部分,如街道号码,城市,国家和邮政编码,文件系统路径可以分解为更小的组件。pathlib允许我们通过点表示法使用路径属性访问和操作这些组件。
使用根目录
根目录是文件系统中最顶层的目录。在类Unix系统中,它由正斜杠(/)表示。在Windows中,它通常是一个驱动器号后跟一个冒号,如C:。
image_file = home / "downloads" / "midjourney.png"image_file.root
输出
'/'
使用父目录
父级包含当前文件或目录。它相对于当前目录或文件高一级。
image_file.parent
输出
PosixPath('/home/bexgboost/downloads')
使用文件名
此属性以字符串形式返回整个文件名,包括扩展名。
image_file.name
输出
'midjourney.png'
使用文件后缀
suffix属性以字符串形式返回文件扩展名,包括点(如果没有扩展名,则返回空字符串)。
image_file.suffix
输出
'.png'
注意:在Mac上,文件路径区分大小写,因此/Users/username/Documents和/users/username/documents会有所不同。
.parts属性
我们可以使用.parts属性将Path对象拆分为它的组件。
image_file.parts
输出
('/', 'home', 'bexgboost', 'downloads', 'midjourney.png')
使用pathlib的常见路径操作
以下是一些使用 pathlib
进行常见路径操作的示例:
-
创建路径对象:
from pathlib import Pathp = Path("/usr/bin")
-
路径拼接:
new_path = p / "local" / "script.py"
-
获取文件扩展名:
extension = new_path.suffix
-
更改文件扩展名:
new_extension = new_path.with_suffix(".txt")
-
检查路径是否存在:
exists = new_path.exists()
-
检查路径是否为文件:
is_file = new_path.is_file()
-
检查路径是否为目录:
is_dir = new_path.is_dir()
-
读取文件内容:
with new_path.open('r') as file:content = file.read()
-
写入文件内容:
with new_path.open('w') as file:file.write("Hello, world!")
-
删除文件:
new_path.unlink()
-
创建目录:
new_path.mkdir(parents=True, exist_ok=True)
-
删除目录:
new_path.rmdir()
-
获取目录中的文件和子目录:
items = list(new_path.iterdir())
-
绝对路径:
absolute_path = new_path.absolute()
-
相对路径:
relative_path = new_path.relative_to("/usr")
-
路径解析:
parts = new_path.parts drive, root, parts = new_path.drive, new_path.root, new_path.parts
-
路径字符串转换:
path_str = str(new_path)
-
遍历目录树:
for child in new_path.rglob('*.py'):print(child)
这些是 pathlib
模块提供的一些基本操作。pathlib
模块使得文件系统路径的操作更加直观和易于管理。