pathlib 模块 - 面向对象的路径处理

Python pathlib 模块提供了面向对象的文件系统路径操作,覆盖路径拼接、查询、遍历等常见任务

分类: stdlib 难度: 中级 更新: 2024-01-15
pathlib 路径处理 文件系统 跨平台 面向对象

pathlib 模块 - 面向对象的路径处理

📝 概述

pathlib 模块自 Python 3.4 引入,提供了面向对象的文件系统路径处理方式。相比 os.path,pathlib 使用更直观的类和方法来表示和操作路径,具备更好的可读性与跨平台兼容性。

🎯 学习目标

  • 理解 Path 与 PurePath 的区别
  • 掌握路径创建、查询、遍历等常见操作
  • 学会跨平台安全处理路径
  • 掌握文件与目录的增删改操作
  • 熟悉路径模式匹配(glob)

📋 前置知识

  • Python 基础语法
  • 文件系统基本概念(路径、文件、目录)
  • 异常处理

🔍 详细内容

Path 类

Path 是 pathlib 模块的核心类,用于表示一个操作系统上的实际路径,支持大量方法来操作文件和目录。

常用方法

  • Path.cwd(): 获取当前工作目录
  • Path.home(): 获取用户主目录
  • Path.exists(): 判断路径是否存在
  • Path.is_dir(): 是否为目录
  • Path.is_file(): 是否为文件
  • Path.mkdir(): 创建目录
  • Path.rmdir(): 删除空目录
  • Path.unlink(): 删除文件
  • Path.rename(): 重命名
  • Path.glob(): 模式匹配查找
  • Path.resolve(): 解析为绝对路径

示例

from pathlib import Path

# 获取当前工作目录和用户主目录
path = Path.cwd()
print(path)
print(Path.home())

# 判断路径是否存在、是否为目录/文件
print(path.exists())
print(path.is_dir())
print(path.is_file())

# 创建/删除目录
Path("testdir").mkdir(exist_ok=True)
Path("testdir").rmdir()

# 创建/删除文件
f = Path("test.txt")
f.touch()   # 创建空文件
f.unlink()  # 删除文件

# 重命名文件
Path("old.txt").write_text("demo")
Path("old.txt").rename("new.txt")
Path("new.txt").unlink()

# 查找匹配的文件
for p in Path(".").glob("*.md"):
    print(p)

PurePath 类

PurePath 是“纯路径”类,不涉及实际文件系统操作,适用于仅做路径解析和格式化的场景。在不同平台上,PurePath 会根据平台风格解析路径,但不会访问文件系统。

常用属性与方法

  • PurePath.joinpath(): 连接多个路径
  • PurePath.parent: 父路径
  • PurePath.name: 名称
  • PurePath.suffix: 后缀名
  • PurePath.suffixes: 所有后缀
  • PurePath.stem: 主体名

路径创建与解析

from pathlib import Path

# 创建 Path 对象(不会访问文件系统)
p = Path('folder') / 'sub' / 'file.txt'  # 使用 / 进行路径拼接
print(p)  # 自动使用当前平台的分隔符

# 解析为绝对路径
print(p.resolve())

# 获取父目录和名称
print(p.parent)  # folder/sub
print(p.name)    # file.txt
print(p.stem)    # file
print(p.suffix)  # .txt
print(p.suffixes)  # ['.tar', '.gz'] 等

目录遍历与查找

from pathlib import Path

# 遍历目录(非递归)
for path in Path('.').iterdir():
    print(path)

# 模式匹配(递归)
for path in Path('.').rglob('*.py'):
    print(path)

安全创建目录与文件

from pathlib import Path

# 递归创建目录
Path('my_dir/sub').mkdir(parents=True, exist_ok=True)

# 创建文件(若存在则不覆盖)
f = Path('file.txt')
if not f.exists():
    f.touch()

跨平台注意事项

  • 使用 Path 或 PurePath,而不是手写分隔符
  • 使用运算符 / 进行路径拼接,可读性更强
  • 在需要字符串路径时,使用 str(Path对象)

从 os.path 迁移到 pathlib

import os
from pathlib import Path

# os.path 风格
os_path = os.path.join('a', 'b', 'c.txt')
print(os_path)

# pathlib 风格
pl_path = Path('a') / 'b' / 'c.txt'
print(pl_path)

💡 实际应用

文件处理常用模式

from pathlib import Path

# 写入文本
p = Path('demo.txt')
p.write_text('Hello, pathlib!', encoding='utf-8')

# 读取文本
text = p.read_text(encoding='utf-8')
print(text)

# 二进制读写
binp = Path('data.bin')
binp.write_bytes(b'\x00\x01')
print(binp.read_bytes())

# 批量改名
for i, file in enumerate(Path('.').glob('*.log')):
    file.rename(f"log_{i}.log")

路径模式注意事项(与 os.path.join 对照)

from pathlib import Path

# 路径拼接:右侧为绝对路径会覆盖左侧
print(Path('aaa') / '/bbb' / 'ccc.txt')  # 输出: /bbb/ccc.txt

# 使用 joinpath 行为一致
print(Path('aaa').joinpath('/bbb', 'ccc.txt'))

# 处理包含 ./ 的路径
print(Path('/aaa').joinpath('./bbb', 'ccc.txt'))  # /aaa/bbb/ccc.txt
print(Path('aaa').joinpath('./bbb', 'ccc.txt'))   # aaa/bbb/ccc.txt

⚠️ 注意事项

  • Path.unlink() 删除文件时,若不存在会抛出 FileNotFoundError,需要捕获或先判断 exists()
  • Path.rmdir() 只能删除空目录,删除非空目录请使用 shutil.rmtree()
  • Path.resolve() 在路径不存在时可能抛出异常,注意捕获

🔗 相关内容

📚 扩展阅读

🏷️ 标签

pathlib 路径处理 面向对象 跨平台 文件系统


最后更新: 2024-01-15
作者: Python 文档团队
版本: 1.0

作者: Python 文档团队

版本: 1.0

讨论与反馈

欢迎在下方留言讨论,分享你的学习心得或提出问题。评论基于GitHub Issues,需要GitHub账号。