pathlib 模块是 Python 3.4+ 内置的用于路径处理模块,它把路径变成了对象,彻底告别传统 os.path 拼接字符串的繁琐写法,而是向操作对象一样。
pathlib 模块可以使代码更简洁、易读、跨平台,而且自动适配 Windows/Linux/Mac 等平台。
pathlib 模块的所有操作都从 Path() 开始,使用 Path() 可以创建一个路径对象,注意,Path 将会自动识别系统路径格式。就像这样:
from pathlib import Path
# 创建路径(绝对/相对都支持)
p1 = Path("test.txt") # 相对路径
print("相对路径:", p1)
p2 = Path("folder/sub/file.txt") # 多级路径
print("多级路径:", p2)
p3 = Path.home() # 用户主目录(跨平台)
print("用户主目录:", p3)
p4 = Path.cwd() # 当前工作目录
print("当前目录:", p4)运行结果:
相对路径: test.txt
多级路径: folder\sub\file.txt
用户主目录: C:\Users\Administrator
当前目录: d:\$share_dir\workspace\5.demo\python_demo在拼接文件路径时,我们可以使用“/”符号直接拼接路径,pathlib 模块将自动适配跨平台。为什么使用“/”符号,而不是使用“\”呢?因为“\”符号需要转义,使用“/”符号更方便,例如:
from pathlib import Path
# 基础拼接
base = Path("project")
file_path = base / "src" / "main.py" # 链式拼接
print("拼接后路径:", file_path)
# 使用 / 符号进行拼接
file_path2 = Path("project/src/main.py")
print("使用 / 符号拼接:", file_path2)
# 使用 \ 符号进行拼接
file_path3 = Path("project\\src\\main.py")
print("使用 \\ 符号拼接:", file_path3)运行结果:
拼接后路径: project\src\main.py
使用 / 符号拼接: project\src\main.py
使用 \ 符号拼接: project\src\main.pypathlib 模块不仅能够自动适配跨平台路径处理,而且还能方便的提取路径信息,如文件名、文件后缀、父目录等信息,例如:
from pathlib import Path
# 使用相对路径创建Path对象
p = Path("folder/test.py")
# 核心属性
print("完整路径:", p.absolute()) # 绝对路径
print("文件名:", p.name) # test.py
print("文件名(无后缀):", p.stem) # test
print("文件后缀:", p.suffix) # .py
print("父目录:", p.parent) # folder
print("所有父目录:", list(p.parents))运行结果:
完整路径: d:\$share_dir\workspace\5.demo\python_demo\folder\test.py
文件名: test.py
文件名(无后缀): test
文件后缀: .py
父目录: folder
所有父目录: [WindowsPath('folder'), WindowsPath('.')]pathlib 模块中,还可以使用 exists() 方法判断文件/目录是否存在,使用 is_file() 方法判断是否为文件,使用 is_dir() 方法判断是否为目录。例如:
from pathlib import Path
p = Path("test.txt")
print("是否存在:", p.exists()) # True/False
print("是否是文件:", p.is_file()) # True
print("是否是目录:", p.is_dir()) # False运行结果:
是否存在: False
是否是文件: False
是否是目录: False还可以使用 pathlib 模块来快速创建或者删除文件和目录:
touch() 创建一个空文件
unlink() 删除文件
mkdir() 创建目录,该目录可以是多级目录
rmdir() 删除空目录
例如:
from pathlib import Path
# 创建文件
p = Path("new_file.txt")
p.touch() # 创建空文件
print("文件创建成功")
# 创建目录(多级)
dir_p = Path("a/b/c")
dir_p.mkdir(parents=True, exist_ok=True) # parents=创建多级,exist_ok=已存在不报错
print("多级目录创建成功")
# 删除文件
p.unlink()
print("文件已删除")
# 删除空目录
dir_p.rmdir() # 这里仅仅删除了c目录,a和b目录仍然存在
print("空目录已删除")运行结果:
文件创建成功
多级目录创建成功
文件已删除
空目录已删除注意,pathlib 模块不擅长复制非空目录、删除非空目录(非空目录指目录中存在目录或文件),我们可以配合 Python 内置的 shutil 模块。例如:
from pathlib import Path
import shutil
import os
# 准备工作
Path("test.txt").write_text("Hello World")
# 创建目录
os.mkdir("folder")
Path("folder/file.txt").write_text("This is a file in the folder.")
# 复制文件
src = Path("test.txt")
dst = Path("copy.txt")
shutil.copy(src, dst)
print("复制了文件")
# 复制目录
shutil.copytree("folder", "folder_copy")
print("复制了目录")
# 删除非空目录
shutil.rmtree("folder")
print("删除了非空目录")运行结果:
复制了文件
复制了目录
删除了非空目录
在 pathlib 模块中,提供了 write_text() 方法用来将字符串写入到文件,read_text() 方法用来将文件数据一次性读取出来,这两个方法避免了繁琐的 open() 方法或 with open。例如:
from pathlib import Path
# 文本文件读写
p = Path("test.txt")
# 写入文本(覆盖)
p.write_text("Hello pathlib!", encoding="utf-8")
# 读取文本
content = p.read_text(encoding="utf-8")
print("读取内容:", content)
# 二进制文件读写
p = Path("test.data")
p.write_bytes(b"binary data") # 写入二进制数据
binary_content = p.read_bytes() # 读取二进制数据
print("二进制内容:", binary_content)运行结果:
读取内容: Hello pathlib!
二进制内容: b'binary data'使用 for 语句结合 Path 函数遍历目录下的文件和目录,涉及的函数如下:
Path.cwd() 获取当前目录。
iterdir() 遍历目录下所有项。
rglob("*.py") 递归查找所有 Python 文件。
glob("*.txt") 仅查找当前目录的 txt 文件。
例如:
from pathlib import Path
# 遍历当前目录所有文件/目录
for item in Path.cwd().iterdir():
print(item)
# 递归遍历所有 .py 文件
for py_file in Path.cwd().rglob("*.py"):
print("Python文件:", py_file)
# 只遍历当前目录 .txt 文件
for txt_file in Path.cwd().glob("*.txt"):
print("Txt文件:", txt_file)运行结果:
d:\$share_dir\workspace\5.demo\python_demo\a
d:\$share_dir\workspace\5.demo\python_demo\demo.py
d:\$share_dir\workspace\5.demo\python_demo\test.data
d:\$share_dir\workspace\5.demo\python_demo\test.txt
Python文件: d:\$share_dir\workspace\5.demo\python_demo\demo.py
Python文件: d:\$share_dir\workspace\5.demo\python_demo\a\demo2.py
Python文件: d:\$share_dir\workspace\5.demo\python_demo\a\b\demo3.py
Txt文件: d:\$share_dir\workspace\5.demo\python_demo\test.txt
在 pathlib 中,可以使用 rename() 方法轻松实现文件 / 目录的重命名和移动功能,无需区分操作类型,直接传入目标路径即可完成。例如:
from pathlib import Path
# 原始文件
p = Path("test.txt")
p.touch(exist_ok=True) # 不存在就创建,存在不报错
# 新文件名
new_name = Path("test_rename.txt")
# 如果目标文件已存在,先删除
if new_name.exists():
new_name.unlink()
# 重命名
renamed_path = p.rename(new_name)
print("重命名完成!新路径:", renamed_path)
# 移动到文件夹
target_folder = Path("folder")
target_folder.mkdir(exist_ok=True) # 自动创建文件夹
# 移动前再次检查:目标存在就删除
final_path = target_folder / new_name.name
if final_path.exists():
final_path.unlink()
# 执行移动
renamed_path.rename(final_path)
print("移动完成!路径:", final_path)运算结果:
重命名完成!新路径: test_rename.txt
移动完成!路径: folder\test_rename.txt可以使用 str() 方法直接将 Path 对象路径转换成一个路径字符串,该路径字符串兼容 os/shutil 模块,例如:
from pathlib import Path
p = Path("a/b\\test.txt")
str_path = str(p) # 转为字符串
print("字符串路径:", str_path)运行结果:
字符串路径: a\b\test.txt使用 pathlib 和 shutil 模块实现文件批量整理,扫描当前目录下面的所有文件,按后缀分类,将文件整理到不同的目录。
具体功能如下:
扫描当前目录所有文件
按后缀分类(图片、文档、代码、其他)
自动创建分类文件夹
移动文件到对应目录
打印整理日志
实现代码:
from pathlib import Path
import shutil
def organize_files():
"""批量整理当前目录文件"""
# 分类规则:后缀 → 目录名
file_types = {
"图片": [".jpg", ".jpeg", ".png", ".gif", ".bmp"],
"文档": [".txt", ".pdf", ".doc", ".docx", ".xls", ".xlsx"],
"代码": [".py", ".java", ".cpp", ".html", ".css", ".js"],
"压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"]
}
# 遍历当前目录所有文件(排除目录)
for file in Path.cwd().iterdir():
if file.is_file():
# 跳过本脚本文件
if file.name == "organize.py":
continue
# 判断文件类型
target_dir = "其他文件"
for folder, suffixes in file_types.items():
if file.suffix.lower() in suffixes:
target_dir = folder
break
# 创建目标目录
target_path = Path.cwd() / target_dir
target_path.mkdir(exist_ok=True)
# 移动文件
try:
file.rename(target_path / file.name)
print(f"✅ 已移动:{file.name} → {target_dir}")
except Exception as e:
print(f"❌ 移动失败:{file.name},原因:{e}")
print("\n🎉 文件整理完成!")
# 执行整理
organize_files()运行示例,查看效果。
整理前:

整理后:

你可以尝试通过参数传递被整了的目录,或者当前目录忽略本 python 脚本整理。
前面章节我们学过 os.path,也是用来操作路径的,那么 pathlib 和 os.path 的主要区别,下面通过一张对比表来看看:
| 操作 | os.path 写法 | pathlib 写法 |
| 拼接路径 | os.path.join("a", "b") | Path("a") / "b" |
| 获取文件名 | os.path.basename(path) | Path(path).name |
| 判断存在 | os.path.exists(path) | Path(path).exists() |
| 遍历目录 | os.listdir(path) | Path(path).iterdir() |
| 绝对路径 | os.path.abspath(path) | Path(path).absolute() |
更多关于 pathlib 模块的信息,请参考 https://docs.python.org/zh-cn/3.14/library/pathlib.html 官方参考手册。