网易首页 > 网易号 > 正文 申请入驻

Python 标准库:pathlib(文件路径与目录操作)

0
分享至

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


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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
41岁台湾女星官宣怀孕,曾做试管婴儿失败,没想过高龄会自然怀孕

41岁台湾女星官宣怀孕,曾做试管婴儿失败,没想过高龄会自然怀孕

暖心萌阿菇凉
2026-10-20 21:54:47
穆帅:国家德比就是国家德比,哪怕我们今天输0-5也不影响

穆帅:国家德比就是国家德比,哪怕我们今天输0-5也不影响

懂球帝
2026-10-22 07:02:12
越来越多人得胰腺癌,医生揭露凶手,竟是冰箱久放的3种食物

越来越多人得胰腺癌,医生揭露凶手,竟是冰箱久放的3种食物

健康科普365
2026-10-03 22:25:05
这就是现实!比腐败更伤人的,是所有央国企员工面对不公的沉默

这就是现实!比腐败更伤人的,是所有央国企员工面对不公的沉默

放开他让wo来
2026-10-10 10:36:15
雍正的帝王之术有多厉害,仅这三个方面,就让后人望尘莫及

雍正的帝王之术有多厉害,仅这三个方面,就让后人望尘莫及

历史大学堂
2026-10-21 14:36:49
没有对比就没有伤害!让高龄妻子生娃的冯远征和李大双不是同类人

没有对比就没有伤害!让高龄妻子生娃的冯远征和李大双不是同类人

小椰的奶奶
2026-10-22 09:48:30
葡萄牙足协用255欧元留住C罗!但C罗用5.3分证明他不行!

葡萄牙足协用255欧元留住C罗!但C罗用5.3分证明他不行!

罗吹终结者
2026-10-21 10:52:43
C罗1000球指日可待!菲利克斯再一次成全了C罗!

C罗1000球指日可待!菲利克斯再一次成全了C罗!

低调看天下
2026-10-21 16:33:07
被戴8次绿帽子,3次被捉奸在床,这就是我们"玉女"守卫的爱情?

被戴8次绿帽子,3次被捉奸在床,这就是我们"玉女"守卫的爱情?

铜臭的历史味
2026-10-21 12:36:03
京留学生披旭日旗,建议开除国籍

京留学生披旭日旗,建议开除国籍

公子故事会
2026-10-21 10:21:25
马克思断言资本主义必将灭亡,现实却是发达国家几乎都是资本主义,如何解释这一历史悖论?

马克思断言资本主义必将灭亡,现实却是发达国家几乎都是资本主义,如何解释这一历史悖论?

磊子讲史
2026-10-08 16:55:33
是谁发明的曾毅回复法的?网友:你这个回复好,不烧心!

是谁发明的曾毅回复法的?网友:你这个回复好,不烧心!

另子维爱读史
2026-10-16 20:06:46
“出钱雇你也好,麻烦出席一下”,广东一新娘恳求新郎出席婚礼,不久后两人分手,男方称“配合演戏”,追讨20.8万元及多件金饰,法院判了

“出钱雇你也好,麻烦出席一下”,广东一新娘恳求新郎出席婚礼,不久后两人分手,男方称“配合演戏”,追讨20.8万元及多件金饰,法院判了

南方都市报
2026-10-20 23:15:15
特朗普曾大胜23点的深红州迎来变数,民主党砸120万美金杀入共和党铁票仓,欲改写密西西比历史

特朗普曾大胜23点的深红州迎来变数,民主党砸120万美金杀入共和党铁票仓,欲改写密西西比历史

14号观星辰
2026-10-21 17:45:06
外媒:俄国防部称,俄罗斯一架苏-30战机在加里宁格勒州执行任务时坠毁

外媒:俄国防部称,俄罗斯一架苏-30战机在加里宁格勒州执行任务时坠毁

环球网资讯
2026-10-21 22:34:14
U16国足VS巴林:4231出击,刘靖磊顶替刘凯源,袁博涵领衔刘宇洋冲锋

U16国足VS巴林:4231出击,刘靖磊顶替刘凯源,袁博涵领衔刘宇洋冲锋

零度眼看球
2026-10-22 07:16:52
申花后悔吗?本赛季放弃的两位王牌都在新东家迎来巅峰,值得期待

申花后悔吗?本赛季放弃的两位王牌都在新东家迎来巅峰,值得期待

振刚说足球
2026-10-22 08:57:54
英国小两口在拼多多买了个花园拱门,收到包裹懵逼了!网友:这就是为什么有些人不该获得选举权的原因...

英国小两口在拼多多买了个花园拱门,收到包裹懵逼了!网友:这就是为什么有些人不该获得选举权的原因...

悦居英国
2026-10-16 18:52:20
广东一地教育局原局长,被查

广东一地教育局原局长,被查

大风新闻
2026-10-21 19:07:03
她是李昌钰二婚妻子,小他18岁是企业家,将美籍丈夫骨灰安葬江苏

她是李昌钰二婚妻子,小他18岁是企业家,将美籍丈夫骨灰安葬江苏

娱说瑜悦
2026-10-21 18:12:47
2026-10-22 12:28:49
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2246文章数 85关注度
往期回顾 全部

科技要闻

腾讯云谷歌紧急行动!互联网安全出大事

头条要闻

公司称被拖欠工程款数百万元 中建一局:安排专人跟进

头条要闻

公司称被拖欠工程款数百万元 中建一局:安排专人跟进

体育要闻

热闹的NBA回来了,他却倒在新赛季大门口

娱乐要闻

杜淳王灿近况曝光:铁婚六年甜上热搜

财经要闻

为卖房,有房企花20万拍短剧

汽车要闻

有七座/续航提升 领克900L曝光还可选双色车身+大饼轮毂

态度原创

健康
教育
时尚
家居
艺术

痘痘能根治吗?皮肤科医生说实话

教育要闻

数智技术赋能,弘扬长征精神 | 纪念中国工农红军长征胜利90周年主题教育活动设计与实践(合集)

中年男人,开始抢着打针回春

家居要闻

2026建博会(广州) 公装联探展交流活动

艺术要闻

20幅 俄罗斯当代画家Vladimir Smakovsky风景油画

无障碍浏览 进入关怀版