pathlib 是 Python 标准库中用于处理文件系统路径的模块,支持路径构造、文件信息查询、目录遍历、文件读写以及复制、移动和删除等操作,常用于批量文件处理、项目资源管理与自动化任务。
pathlib 以路径对象组织操作,可以将目录、文件名和扩展名分别处理,减少手工拼接字符串时的错误。路径对象既可以表示已有文件,也可以表示准备创建的位置;构造路径本身不会创建文件或目录。
一、导入与适用范围
1、导入模块
pathlib 随 Python 提供,无需通过 pip 单独安装。
通常只需导入 Path:
from pathlib import PathPath 根据程序运行的平台使用相应的路径规则,适用于 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.csvwith_name() 和 with_suffix() 返回新的路径对象,不会重命名实际文件,也不会转换文件格式。
例如,将 .xlsx 改为 .csv 只改变路径名称;格式转换仍需读取原数据并按目标格式重新保存。
4、转换为字符串
• str(path):使用当前路径风格生成字符串
• as_posix():使用 / 作为分隔符生成字符串
许多 Python 文件接口可以直接接受 Path 对象。只有接口明确要求字符串时,才需要调用 str()。
5、绝对路径解析
resolve() 返回绝对路径,并解析符号链接和 .. 等路径组成部分。
默认情况下,目标不存在也可以得到解析后的路径。需要确认解析过程中的路径实际存在时,可使用:
resolved_path = path.resolve(strict=True)因此,获得绝对路径不等于确认文件存在。
6、计算相对路径
输出:
data/students.xlsxrelative_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 以路径对象统一组织路径构造、文件读写与目录管理。掌握相对路径的基准、路径转换与实际操作的区别,并结合明确的处理范围和异常处理,可构建清晰可靠的文件自动化流程。
“点赞有美意,赞赏是鼓励”
热门跟贴