Python3 pathlib 模块及应用

🎉摘要:本文详解 Python pathlib 模块,告别繁琐的 os.path 字符串拼接。涵盖路径对象创建、跨平台拼接、文件读写、目录遍历及批量整理实战。提供完整代码示例与对比表,助您掌握面向对象的路径处理技巧,提升 Python 文件操作效率。

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.py

获取路径属性(文件名、后缀、父目录)

pathlib 模块不仅能够自动适配跨平台路径处理,而且还能方便的提取路径信息,如文件名、文件后缀、父目录等信息,例如:

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 模块实现文件批量整理,扫描当前目录下面的所有文件,按后缀分类,将文件整理到不同的目录。

具体功能如下:

  1. 扫描当前目录所有文件

  2. 按后缀分类(图片、文档、代码、其他)

  3. 自动创建分类文件夹

  4. 移动文件到对应目录

  5. 打印整理日志

实现代码:

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 官方参考手册。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号