Python中使用pathlib进行文件系统操作

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 进行常见路径操作的示例:

  1. 1. 创建路径对象:
    from pathlib import Path
    
    p = Path("/usr/bin")
  2. 2. 路径拼接:
    new_path = p / "local" / "script.py"
  3. 3. 获取文件扩展名:
    extension = new_path.suffix
  4. 4. 更改文件扩展名:
    new_extension = new_path.with_suffix(".txt")
  5. 5. 检查路径是否存在:
    exists = new_path.exists()
  6. 6. 检查路径是否为文件:
    is_file = new_path.is_file()
  7. 7. 检查路径是否为目录:
    is_dir = new_path.is_dir()
  8. 8. 读取文件内容:
    with new_path.open('r') as file:
        content = file.read()
  9. 9. 写入文件内容:
    with new_path.open('w') as file:
        file.write("Hello, world!")
  10. 10. 删除文件:
    new_path.unlink()
  11. 11. 创建目录:
    new_path.mkdir(parents=True, exist_ok=True)
  12. 12. 删除目录:
    new_path.rmdir()
  13. 13. 获取目录中的文件和子目录:
    items = list(new_path.iterdir())
  14. 14. 绝对路径:
    absolute_path = new_path.absolute()
  15. 15. 相对路径:
    relative_path = new_path.relative_to("/usr")
  16. 16. 路径解析:
    parts = new_path.parts
    drive, root, parts = new_path.drive, new_path.root, new_path.parts
  17. 17. 路径字符串转换:
    path_str = str(new_path)
  18. 18. 遍历目录树:
    for child in new_path.rglob('*.py'):
        print(child)

这些是 pathlib 模块提供的一些基本操作。pathlib 模块使得文件系统路径的操作更加直观和易于管理

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/78978.html

(0)
guozi's avatarguozi
上一篇 2024年5月30日 下午3:12
下一篇 2024年5月30日 下午3:30

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注