一、 简介
pathlib是python3.4引入的标准库,提供了面向对象地、更直观的处理文件系统路径。推出pathlib的目的在于替代传统的os.path模块。
二、 Path Class
pathlib的一种有点就是提供面向对象的方式处理文件系统路径,于是Path类就很关键。
from pathlib import Path
p = Path('/home/user/documents/report.txt')
2.1、 路径拼接
pathlib可以使用/ 操作符来连接路径,如下:
from pathlib import Path
# 拼接路径
base_dir = Path('/home/user')
file_path = base_dir / 'documents' / 'report.txt'
print(file_path) # 输出: /home/user/documents/report.txt
# 也可以从字符串开始
config_path = Path('config') / 'settings.json'
print(config_path) # 输出: config/settings.json (Windows 上是 config\settings.json)
2.2、 获取路径的各个部分(属性)
p = Path('/home/user/docs/report.v2.py')
print(p.parent) # /home/user/docs → 父目录
print(p.name) # report.v2.py → 文件名(含扩展名)
print(p.stem) # report.v2 → 文件名(不含扩展名)
print(p.suffix) # .py → 最后一个扩展名
print(p.suffixes) # ['.v2', '.py'] → 所有扩展名(列表)
print(p.anchor) # / → 根目录(Windows 是 C:\)
print(p.drive) # (Windows 有值) → 驱动器盘符
常用属性名
| 属性名 | 作用 |
|---|---|
| parent | 父目录 |
| name | 文件名(含扩展名) |
| stem | 文件名(不含扩展名) |
| suffix | 最后一个扩展名 |
| parents | 一个父母录的数组 |
2.3、 解析路径
解析路径的作用主要是将相对路径转换成绝对路径,即处理路径中的.、..等
# 获取绝对路径(并解析 .. 和 .)
p = Path('../file.txt')
absolute = p.resolve()
print(absolute) # 输出完整的绝对路径
2.4、 检查路径状况
检查路径状态主要是判断这个路径是否存在、是文件还是目录,以便进行后续操作。
p = Path('../file.txt')
p.exists() # 文件/目录是否存在
p.is_file() # 是否是文件
p.is_dir() # 是否是目录
2.5、 遍历当前目录
主要是Path类的三个方法:Path.iterdir()、Path.glob(pattern)、Path.rglob(pattern)。
三个方法返回的内容都是Path对象迭代器
| 方法 | 是否递归 | 支持通配符 | 用于什么 |
|---|---|---|---|
iterdir() | 否 | 否 | 遍历当前目录所有项 |
glob() | 否 | 是 | 当前目录下筛选匹配文件 |
rglob() | 是 | 是 | 所有子目录中递归筛选文件 |
Path.iterdir()
from pathlib import Path
p = Path('/some/path')
for item in p.iterdir():
print(item)
输出内容:
/some/path/file1.txt
/some/path/file2.py
/some/path/folder
Path.glob(pattern)
from pathlib import Path
p = Path('/some/path')
for item in p.glob('*.txt'):
print(item)
输出内容:
/some/path/file1.txt
/some/path/notes.txt
Path.rglob(pattern)
from pathlib import Path
p = Path('/some/path')
for item in p.rglob('*.py'):
print(item)
输出内容:
/some/path/file1.py
/some/path/subdir/file2.py
2.6、 创建、删除目录和文件
创建目录
from pathlib import Path
# 创建单层目录
Path("my_folder").mkdir()
# 创建多层目录(如 parent/child),若父目录不存在时使用 parents=True
Path("parent/child").mkdir(parents=True, exist_ok=True)
parents=True: 自动创建所有上级目录。
exist_ok=True: 若目录已存在,不报错。
删除空目录:pathlib只能删除空目录,对于非空目录,库中没有直接的方法需要结合shutil
Path("my_folder").rmdir()
若目录不为空就会抛出异常
创建文件
touch() 方法会创建一个空文件,如果文件已经存在则不会改变已存在的文件中的内容。
Path("example.txt").touch()
2.7、 操作文件中的内容
pathlib中的方法可以操作文件中的内容进行读写,但是只适用于小文件,这里不做记录,对于文件操作还是使用with open等更高效的方法。
三、 _file_
python中的__file__是一个python的内置变量,他在模块中表示该模块源文件的路径,这个路径可能是相对路径也可能是绝对路径,可以和pathlib搭配使用,将相对路径解析。需要注意的是在交互式解释器中,这个内置变量是未定义的
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent
data_path = BASE_DIR / "data" / "file.json"
四、 pathlib和os的对比
| 特点 | os.path | pathlib |
|---|---|---|
| 风格 | 面向过程(函数式) | 面向对象(OOP) |
| 引入版本 | Python 早期版本就有 | Python 3.4+(推荐用法) |
| 代码风格 | 基于字符串 | 使用 Path 类(更语义化) |
| 功能 | os.path 示例 | pathlib 示例 |
|---|---|---|
| 拼接路径 | os.path.join(a, b) | Path(a) / b |
| 获取绝对路径 | os.path.abspath("file.txt") | Path("file.txt").resolve() |
| 判断是否存在 | os.path.exists("a/b") | Path("a/b").exists() |
| 是否是文件 | os.path.isfile("a/b.txt") | Path("a/b.txt").is_file() |
| 是否是目录 | os.path.isdir("a") | Path("a").is_dir() |
| 获取文件名 | os.path.basename(path) | Path(path).name |
| 获取扩展名 | os.path.splitext(path)[1] | Path(path).suffix |
| 遍历目录 | os.listdir(path) + 拼接 | Path(path).iterdir() |
| 递归搜索 | os.walk(path) | Path(path).rglob("*.txt") |
| 创建目录 | os.makedirs("new_dir", exist_ok=True) | Path("new_dir").mkdir(parents=True, exist_ok=True) |
| 删除文件 | os.remove("file.txt") | Path("file.txt").unlink() |
| 场景 | 推荐模块 | 原因 |
|---|---|---|
| 现代 Python 开发 | pathlib | 更简洁、可读性好、功能更强 |
| 与老代码兼容 | os.path | 某些项目可能还依赖它 |
| 处理路径的链式操作 | pathlib | Path() 对象链式调用更自然 |
| 跨平台路径拼接(Windows/Linux) | 两者都行,但 pathlib 更方便 |
当然现在更推荐使用pathlib,更pythonic
1709

被折叠的 条评论
为什么被折叠?



