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

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.

相关推荐
热点推荐
法国访谈节目《The Bridge》就姆巴佩事件道歉:视频系今年4月录制的节目花絮;我们对该视频给中国及世界各地的人们造成的冒犯深表遗憾

法国访谈节目《The Bridge》就姆巴佩事件道歉:视频系今年4月录制的节目花絮;我们对该视频给中国及世界各地的人们造成的冒犯深表遗憾

都市快报橙柿互动
2026-10-28 06:55:44
樱花演唱会再露"下乳"引争议,粉丝怒问造型团队

樱花演唱会再露"下乳"引争议,粉丝怒问造型团队

浅遇时光
2026-10-26 04:35:36
3-0,3-0,WTT冠军赛乱套了:孙颖莎制造惨案,林诗栋超级大逆转!

3-0,3-0,WTT冠军赛乱套了:孙颖莎制造惨案,林诗栋超级大逆转!

田先生篮球
2026-10-28 06:48:35
老戏骨董勇车险续保被卡一个月,网上维权,吐槽太平洋保险“店大欺客”

老戏骨董勇车险续保被卡一个月,网上维权,吐槽太平洋保险“店大欺客”

大风新闻
2026-10-28 18:21:02
某界汽车,月销量仅剩29辆!

某界汽车,月销量仅剩29辆!

电动内参
2026-10-29 01:32:33
名记:皇马内部不理解姆巴佩发声明为何不通过俱乐部,俱乐部认为处理类似事情更有经验

名记:皇马内部不理解姆巴佩发声明为何不通过俱乐部,俱乐部认为处理类似事情更有经验

尘语者
2026-10-28 17:07:59
皇马官方声明道歉:对中国人民充满尊重,姆巴佩已表达悔意

皇马官方声明道歉:对中国人民充满尊重,姆巴佩已表达悔意

全景体育V
2026-10-28 17:11:47
《伟大的长征》钱壮飞掉队那一段,越想越不对:一个拆过六封绝密电报的人,最后居然被一匹骡子要了命

《伟大的长征》钱壮飞掉队那一段,越想越不对:一个拆过六封绝密电报的人,最后居然被一匹骡子要了命

磊子讲史
2026-10-28 14:55:52
改革开放后有三大耻辱,件件都是民族伤疤。1993年、1999年、2001年这三个年份对中国人而言,每个数字背后都是一段屈辱经历

改革开放后有三大耻辱,件件都是民族伤疤。1993年、1999年、2001年这三个年份对中国人而言,每个数字背后都是一段屈辱经历

扶苏聊历史
2026-10-28 15:05:54
刚刚,皇马全平台致歉!包含海外超3亿粉丝的多个官方账号

刚刚,皇马全平台致歉!包含海外超3亿粉丝的多个官方账号

十点街球体育
2026-10-28 21:01:39
上市后首份财报出炉!宇树科技前三季度实现净利约3.87亿元,同比增长270.54%

上市后首份财报出炉!宇树科技前三季度实现净利约3.87亿元,同比增长270.54%

北京商报
2026-10-28 19:45:08
队报:皇马拒绝了西甲对姆巴佩事件的帮助;皇马高层想看特瓦斯笑话

队报:皇马拒绝了西甲对姆巴佩事件的帮助;皇马高层想看特瓦斯笑话

懂球帝
2026-10-28 08:58:05
连续数月多次触摸女同事大腿,甚至将手伸入其上衣抚摸隐私部位,42岁摄影师被澳门警方拘捕

连续数月多次触摸女同事大腿,甚至将手伸入其上衣抚摸隐私部位,42岁摄影师被澳门警方拘捕

南方都市报
2026-10-28 08:28:04
76岁加拿大华侨坦言:如今中国生活水平,相当于加拿大80年代?

76岁加拿大华侨坦言:如今中国生活水平,相当于加拿大80年代?

爱下厨的阿酾
2026-10-28 18:59:19
令人心碎!“只有几分钟就走了”,长沙35岁教师骤然离世,满墙荣誉,一双年幼儿女

令人心碎!“只有几分钟就走了”,长沙35岁教师骤然离世,满墙荣誉,一双年幼儿女

火山詩话
2026-10-28 11:12:15
李家超深切哀悼国务院原副总理刘延东逝世

李家超深切哀悼国务院原副总理刘延东逝世

看看新闻Knews
2026-10-28 22:43:14
哈尔滨29岁女子外出游玩被蜱虫咬伤,在ICU住了28天,目前四肢瘫痪,丈夫称已花费40万元治疗

哈尔滨29岁女子外出游玩被蜱虫咬伤,在ICU住了28天,目前四肢瘫痪,丈夫称已花费40万元治疗

新京报
2026-10-28 14:36:32
有钱人的想法是摸不透的,你看71岁的周润发,花1.28亿港元买下山顶豪宅,装修好了却一直没住,也没租给别人。

有钱人的想法是摸不透的,你看71岁的周润发,花1.28亿港元买下山顶豪宅,装修好了却一直没住,也没租给别人。

平凡日子生微光
2026-10-26 15:18:30
旭日旗事件越闹越大!陈宇昕三代都是亲日分子,母亲身份已澄清

旭日旗事件越闹越大!陈宇昕三代都是亲日分子,母亲身份已澄清

平老师666
2026-10-27 20:56:19
黄仁勋彻底不装了!中国不买美国英伟达的H200芯片,全球人工智能芯片市场出现了值得关注的变化,国产份额往上顶,对比很扎眼!

黄仁勋彻底不装了!中国不买美国英伟达的H200芯片,全球人工智能芯片市场出现了值得关注的变化,国产份额往上顶,对比很扎眼!

林杰论事
2026-10-28 18:03:38
2026-10-29 02:59:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
2258文章数 85关注度
往期回顾 全部

科技要闻

宇树科技前三季净利暴增270%

头条要闻

仅退款后冰柜仍插着电在使用 买家回应

头条要闻

仅退款后冰柜仍插着电在使用 买家回应

体育要闻

0胜4负与篮网国王一桌 热火字母哥赌错了?

娱乐要闻

巾帼不让须眉!章子怡拿下重磅荣誉

财经要闻

iPhone Duo七年等来一场吐槽大会

汽车要闻

首销期权益价23.98万起 2026款理想i6上市

态度原创

旅游
家居
房产
手机
游戏

旅游要闻

忻州古城“古城焕新·产城共荣”入选2026中国旅游产业影响力案例

家居要闻

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

房产要闻

重新定义城芯院墅生活!33席印德华府,看见湾区墅居的时代答案

手机要闻

华为Pura90 Plus、畅享100系列发布!多款新品亮相

盖世小鸡推出《GTA6》配色手柄 但疑似没有联动

无障碍浏览 进入关怀版