pathlib 是 Python 标准库中用于处理文件系统路径的模块,支持路径构造、文件信息查询、目录遍历、文件读写以及复制、移动和删除等操作,常用于批量文件处理、项目资源管理与自动化任务。

pathlib 以路径对象组织操作,可以将目录、文件名和扩展名分别处理,减少手工拼接字符串时的错误。路径对象既可以表示已有文件,也可以表示准备创建的位置;构造路径本身不会创建文件或目录。

一、导入与适用范围

1、导入模块

pathlib 随 Python 提供,无需通过 pip 单独安装。

通常只需导入 Path:

from pathlib import Path

Path 根据程序运行的平台使用相应的路径规则,适用于 Windows、macOS 和 Linux 等系统。

2、主要应用

(1)路径构造与解析

组合目录和文件名,获取父目录、文件名及扩展名。

(2)文件状态查询

判断路径是否存在,区分文件与目录,读取大小和修改时间。

(3)目录遍历与文件筛选

列出目录内容,按名称或扩展名查找文件,递归处理子目录。

(4)文件读写

读取和写入文本或二进制数据,创建输出目录。

(5)批量文件管理

复制、移动、重命名或删除文件,并与 Excel、Word、图像处理等库配合使用。

二、核心概念与路径构造

1、路径对象

路径对象(Path)用于表示文件系统中的位置。

以上代码仅创建路径对象,不会检查目标是否存在,也不会创建对应文件或目录。

实际文件系统操作需要调用相应方法,例如 mkdir()、read_text() 或 rename()。

2、路径拼接

使用 / 运算符组合路径:

也可以在构造时传入多个组成部分:

file_path = Path("project", "data", "students.xlsx")

或使用 joinpath():

file_path = base_dir.joinpath("data", "students.xlsx")

这些写法均由 pathlib 处理路径分隔符,无需手工连接反斜杠或斜杠。

拼接子路径时,应使用相对路径。如果后续部分是绝对路径,前面的路径可能被舍弃。

3、相对路径与绝对路径

相对路径(Relative Path)需要结合某个基准位置解释;文件读写操作中的相对路径通常以当前工作目录为基准。

file_path = Path("data") / "students.xlsx"

绝对路径(Absolute Path)包含定位文件所需的完整路径信息,不依赖当前工作目录。

Windows 中可写为:

file_path = Path("D:/project/data/students.xlsx")

使用反斜杠时,可采用原始字符串:

file_path = Path(r"D:\project\data\students.xlsx")

普通字符串中的反斜杠可能参与转义,例如 \n 表示换行。使用 / 或原始字符串有助于避免此类问题。

4、当前工作目录与用户主目录

• Path.cwd():返回当前工作目录

• Path.home():返回当前用户的主目录

包含 ~ 的路径需要显式展开:

file_path = Path("~/notes.txt").expanduser()

Path("~/notes.txt") 本身不会自动将 ~ 转换为主目录。

5、脚本目录

在普通 Python 脚本中,可根据 __file__ 获取脚本所在目录:

该写法适合让资源路径相对于脚本位置保持稳定。

交互式解释器和 Notebook 通常没有 __file__,此时应根据实际任务使用 Path.cwd() 或明确指定目录。

6、纯路径

纯路径(PurePath)只进行路径结构运算,不访问文件系统。

PureWindowsPath 可以在非 Windows 系统上解析 Windows 路径;相应地,PurePosixPath 用于解析 POSIX 风格路径。

纯路径适合处理路径文本,不提供文件读写和目录创建等操作。常规文件处理使用 Path 即可。

三、路径组成与转换

1、获取路径组成部分

输出:

('reports', 'sales_2026.xlsx')

常用属性包括:

• name:最后一个路径组成部分,通常为文件名

• stem:去掉最后一个扩展名后的名称

• suffix:最后一个扩展名,包含前导点

• suffixes:所有扩展名组成的列表

• parent:上一级路径

• parts:路径各组成部分构成的元组

这些属性根据路径结构计算,不要求文件实际存在。

2、多个扩展名

输出:

['.tar', '.gz']

stem 仅去掉最后一个扩展名,不会自动移除全部后缀。

3、构造新的文件名与扩展名

输出:

reports/sales.csv

with_name() 和 with_suffix() 返回新的路径对象,不会重命名实际文件,也不会转换文件格式。

例如,将 .xlsx 改为 .csv 只改变路径名称;格式转换仍需读取原数据并按目标格式重新保存。

4、转换为字符串

• str(path):使用当前路径风格生成字符串

• as_posix():使用 / 作为分隔符生成字符串

许多 Python 文件接口可以直接接受 Path 对象。只有接口明确要求字符串时,才需要调用 str()。

5、绝对路径解析

resolve() 返回绝对路径,并解析符号链接和 .. 等路径组成部分。

默认情况下,目标不存在也可以得到解析后的路径。需要确认解析过程中的路径实际存在时,可使用:

resolved_path = path.resolve(strict=True)

因此,获得绝对路径不等于确认文件存在。

6、计算相对路径

输出:

data/students.xlsx

relative_to() 根据路径结构计算相对位置,不访问文件系统。默认用法要求目标路径位于指定基准路径之下,否则会引发 ValueError。

相对路径与绝对路径不宜直接混用;必要时可先统一为绝对路径,再计算相对位置。

四、路径检查与目录创建

1、检查路径状态

• exists():判断路径是否指向存在的对象

• is_file():判断是否指向普通文件

• is_dir():判断是否指向目录

符号链接通常按其目标进行判断。需要识别链接本身时,可使用 is_symlink()。

路径检查与后续操作是两个独立步骤。检查通过后,文件仍可能被其他程序移动或删除,因此实际读写仍可能发生异常。

2、创建目录

参数说明:

• parents=True:同时创建缺失的父目录

• exist_ok=True:目标已经是目录时,不因其存在而报错

如果相同路径已经是文件,exist_ok=True 也不能将其作为目录使用。

3、创建空文件

文件不存在时,touch() 创建空文件;文件已存在时,通常更新其修改时间,不清空内容。

若要求文件必须不存在,可使用:

path.touch(exist_ok=False)

目标已存在时会引发 FileExistsError。

4、查询文件信息

stat() 返回文件状态信息,其中:

• st_size:普通文件的大小,单位为字节

• st_mtime:最后修改时间的时间戳

datetime.fromtimestamp() 按本地时区将时间戳转换为日期时间。

五、文件读取与写入

1、文本写入与读取

write_text() 将字符串写入文件并关闭文件;read_text() 读取全部文本后关闭文件。

需要注意:

• write_text() 会覆盖已有内容。

• 父目录不会自动创建。

• 中文文本宜明确指定编码。

• read_text() 会一次性将全部内容读入内存。

2、追加文本

追加内容需要使用 open():

    

常用模式包括:

• "r":读取文本

• "w":写入文本,覆盖已有内容

• "a":在文件末尾追加文本

• "x":仅创建新文件,目标已存在时引发异常

• "rb"、"wb":读取或写入二进制数据

with 语句在代码块结束时关闭文件。

3、逐行读取

        

逐行处理适合较大的文本文件,可以避免将全部内容一次性读入内存。

示例中的 rstrip("\r\n") 仅移除行末的换行字符,保留其他空格。

4、二进制读写

read_bytes() 返回字节串,write_bytes() 写入字节数据。

该方式会将整个文件载入内存。对于较大的文件或目录复制,宜使用专门的复制接口。

六、目录遍历与文件筛选

1、遍历当前目录

        

iterdir() 仅列出当前目录的直接子项,不递归进入子目录。

遍历顺序没有固定保证;需要稳定的展示或处理顺序时,可使用 sorted()。

2、按模式匹配文件

        

常见通配符包括:

• *:匹配路径某一部分中的任意数量字符

• ?:匹配单个字符

• [abc]:匹配括号中任意一个字符

• **:用于匹配多级目录

glob() 的结果也可能包含目录,因此只处理文件时,宜结合 is_file() 判断。

3、递归查找文件

        

rglob("*.xlsx") 在当前目录及其子目录中递归匹配。

如果需要统一处理扩展名大小写,可以遍历后比较:

        

该写法可同时识别 .xlsx 和 .XLSX。

4、按目录层级遍历

需要分别获取每层目录中的子目录名和文件名时,可使用 walk():

每次迭代返回三个值:

• current_dir:当前目录的 Path 对象

• dirnames:子目录名称列表

• filenames:非目录条目的名称列表

默认自上而下遍历时,可以原地修改 dirnames,控制后续进入哪些子目录。

walk() 默认不跟随目录符号链接。若启用链接跟随,应考虑循环链接造成重复遍历的问题。

七、复制、移动与删除

1、文件复制

copy() 将文件或目录树复制到指定目标,并返回目标路径对象。

如果目标是已有文件,其内容会被替换。需要保留支持的时间戳、权限等元数据时,可设置:

copied_path = source.copy(target, preserve_metadata=True)

复制到已有目录并保留原名称,可使用:

copied_path = source.copy_into(Path("backup"))

部分旧环境尚不提供这些方法,可使用 shutil.copy2() 复制文件,或使用 shutil.copytree() 复制目录。

2、重命名

rename() 执行实际重命名,并返回新的路径对象。

路径对象不可变,因此原变量 source 仍表示旧路径;后续操作应使用 new_path 或重新赋值。

目标已经存在时,rename() 的行为存在平台差异:Windows 通常引发异常,Unix 系统可能替换已有文件。明确需要替换目标文件时,可使用 replace()。

new_path = source.replace(target)

rename() 和 replace() 的相对目标路径以当前工作目录为基准。使用 source.with_name() 可以明确将目标放在原目录中。

3、移动文件或目录

move() 将文件或目录树移动到指定目标。跨文件系统时,通过复制后删除源内容完成移动。

移动到已有目录并保留原名称,可使用:

moved_path = source.move_into(archive_dir)

目标文件已存在时可能被覆盖,因此应根据任务要求确定目标名称。

旧环境中可使用 shutil.move();rename() 不宜作为通用的跨文件系统移动方式。

4、删除文件与空目录

删除文件:

missing_ok=True 表示目标不存在时不报错。

删除空目录:

folder.rmdir()

rmdir() 只删除空目录,不递归删除其中的内容。

对符号链接执行 unlink() 时,删除的是链接本身。上述删除操作通常不会将项目移入回收站,执行前应确认目标路径。

八、批量处理与其他库配合

1、批量生成文本文件

生成的文件名为:

notice_002.txt

将目录与文件名分别构造,便于统一调整输出位置和命名规则。

2、保留目录结构批量复制

    

relative_to() 提取源文件相对于输入目录的位置,再将该相对路径拼接到输出目录,可保留原有子目录结构。

输出目录宜放在遍历范围之外,避免生成文件再次进入处理流程。

3、配合 OpenPyXL

pathlib 负责路径构造和目录创建,OpenPyXL 负责 Excel 内容写入。

4、配合 python-docx

路径对象可以直接传给支持路径协议的接口,无需在每次调用前转换为字符串。

九、常用接口速览

以下采用常用调用形式,部分参数已简化。path 表示路径对象。

1、路径构造与定位

Path(...)

创建适用于当前平台的路径对象。

Path.cwd()

获取当前工作目录。

Path.home()

获取当前用户主目录。

path / "filename"

构造子路径。

path.resolve()

返回解析后的绝对路径。

path.expanduser()

展开路径开头的 ~。

path.relative_to(base)

计算相对于指定基准的路径。

2、路径组成

path.name

获取最后一个路径组成部分。

path.stem

获取去掉最后一个扩展名后的名称。

path.suffix、path.suffixes

获取最后一个扩展名或全部扩展名。

path.parent、path.parts

获取上一级路径或路径组成部分。

path.with_name(name)

返回替换名称后的新路径。

path.with_suffix(suffix)

返回替换最后一个扩展名后的新路径。

3、状态查询与创建

path.exists()

检查路径是否存在。

path.is_file()、path.is_dir()

判断是否为普通文件或目录。

path.stat()

读取文件状态信息。

path.mkdir(parents=True, exist_ok=True)

创建目录及缺失的父目录。

path.touch()

创建空文件,或更新已有文件的修改时间。

4、读取与写入

path.read_text(encoding="utf-8")

读取全部文本。

path.write_text(text, encoding="utf-8")

写入文本,覆盖已有内容。

path.read_bytes()、path.write_bytes(data)

读取或写入二进制数据。

path.open(mode, ...)

打开文件,返回文件对象。

5、遍历与匹配

path.iterdir()

遍历直接子项。

path.glob(pattern)

按模式匹配路径。

path.rglob(pattern)

递归匹配路径。

path.walk()

按目录层级遍历目录树。

6、文件管理

path.copy(target)、path.copy_into(target_dir)

复制到指定目标路径或已有目录。

path.rename(target)、path.replace(target)

重命名或替换目标。

path.move(target)、path.move_into(target_dir)

移动到指定目标路径或已有目录。

path.unlink(missing_ok=True)

删除文件或符号链接,忽略目标不存在的情况。

path.rmdir()

删除空目录。

十、使用注意事项

1、路径构造与文件操作

with_name()、with_suffix() 和 / 等操作只构造新路径。

mkdir()、write_text()、rename()、copy()、move() 和 unlink() 等方法才会改变文件系统内容。

区分这两类操作,有助于避免将路径转换误认为文件修改。

2、跨平台路径

Path 使用当前运行平台的规则,不会将 Windows 盘符路径自动转换为其他系统上的实际位置。

跨平台程序宜使用配置目录、用户主目录或项目目录构造路径。仅需解析其他平台的路径文本时,使用对应的纯路径类。

3、异常处理

文件操作可能因路径不存在、权限不足或目标冲突而失败。可按实际任务捕获相应异常:

    

不同异常对应不同原因,不宜统一解释为“路径错误”。

4、批量处理范围

批量操作前,应确认输入目录、匹配条件和输出位置。

递归遍历可能涉及大量文件;复制、移动和删除前,可先输出目标列表,核对范围后再执行。需要固定处理顺序时,应显式排序。

5、运行环境兼容性

pathlib 随 Python 更新,不同环境提供的方法可能有所差异。

如果出现方法不存在的 AttributeError,应检查当前解释器所提供的接口。旧环境可使用 os.walk()、shutil.copy2()、shutil.copytree() 和 shutil.move() 完成相应操作。

小结

pathlib 以路径对象统一组织路径构造、文件读写与目录管理。掌握相对路径的基准、路径转换与实际操作的区别,并结合明确的处理范围和异常处理,可构建清晰可靠的文件自动化流程。

打开网易新闻 查看精彩图片

“点赞有美意,赞赏是鼓励”