本文要点
先在练习目录里构造几个自建路径对象,只打印属性,不碰真实文件
这是最容易判断错的一处
下面这张表是编辑根据文档示例整理的对照,供你逐行核对,不是对真实文件的检测记录

本文目录
先分清四个属性各自回答什么问题
假设你在练习目录里有一个自建路径对象,想从它身上读出文件名、主名和后缀。pathlib 把这几个问题拆成了不同属性,不要混用。
按 Python 官方 pathlib 文档的说明:
- name 返回路径的最后一个组成部分,不含盘符和根。
- stem 返回最后一个组成部分去掉后缀之后的部分。
- suffix 返回最后一个组成部分里最后一段以点分隔的部分,也就是常说的扩展名。
- suffixes 返回一个列表,列出该路径的全部后缀。
关键区别在于:stem 和 suffix 是一对,它们只处理“最后一个后缀”;suffixes 则把所有后缀都列出来。
本文只读自建 Path 对象,不执行重命名、删除或移动。所有路径都是练习用的自建示例。
用自建路径看name和stem分别取到哪一段
先在练习目录里构造几个自建路径对象,只打印属性,不碰真实文件。
from pathlib import Path
p1 = Path("exercise/notes.txt")
print(p1.name) # notes.txt
print(p1.stem) # notes
p2 = Path("exercise/archive.tar.gz")
print(p2.name) # archive.tar.gz
print(p2.stem) # archive.tar对照文档的解释:name 是最后一段,所以 p1 得到 notes.txt;stem 是去掉后缀后的最后一段,所以 p1 得到 notes。
p2 是重点。它的 name 是 archive.tar.gz,而 stem 是 archive.tar,不是 archive。原因是 stem 只去掉 suffix 所认定的那一个后缀(.gz),剩下的 archive.tar 全部算作主名。
如果你以为 stem 会去掉所有后缀,就会在这里得到错误预期。文档对 stem 的定义是“最后一个组成部分去掉它的后缀”,不是去掉全部后缀。
多重后缀下suffix只取最后一段,suffixes取全部
这是最容易判断错的一处。用同一个自建路径对照两个属性:
from pathlib import Path
p = Path("exercise/archive.tar.gz")
print(p.suffix) # .gz
print(p.suffixes) # ['.tar', '.gz']文档给出的例子正是这个:PurePosixPath('my/library.tar.gz').suffix 返回 '.gz',而 suffixes 返回 ['.tar', '.gz']。
所以判断规则可以写成两句话:
1. suffix 永远只取最后一个点之后的那一段。
2. suffixes 把所有以点开头的后缀段按顺序列成列表。
再看没有后缀的情况:
p = Path("exercise/library")
print(p.suffix) # ''
print(p.suffixes) # []文档说明,没有后缀时 suffix 返回空字符串,suffixes 返回空列表。这两个结果不一样,一个是空字符串,一个是空列表,写判断条件时要注意区分。
用一张对照表核对同一路径的四个属性
下面这张表是编辑根据文档示例整理的对照,供你逐行核对,不是对真实文件的检测记录。
| 路径 | name | stem | suffix | suffixes |
| --- | --- | --- | --- | --- |
| exercise/notes.txt | notes.txt | notes | .txt | ['.txt'] |
| exercise/archive.tar.gz | archive.tar.gz | archive.tar | .gz | ['.tar', '.gz'] |
| exercise/library | library | library | '' | [] |
核对时按列读,不要跳列。比如 archive.tar.gz 这一行,stem 是 archive.tar,suffix 是 .gz,两者拼起来正好还原成 name。而 suffixes 是两段,说明这个文件名里有两个后缀段。
一个容易踩的坑:看到 suffixes 有两段,就以为 stem 会去掉两段。对照表里 archive.tar.gz 的 stem 是 archive.tar,不是 archive,这就是证据。
完整路径里name取的是最后一段,不是整条路径
name 不是完整路径字符串,它只是最后一段。用带目录的自建路径验证:
from pathlib import Path
p = Path("exercise/demo_scan/report.final.txt")
print(p.name) # report.final.txt
print(p.stem) # report.final
print(p.suffix) # .txt
print(p.suffixes) # ['.final', '.txt']对照文档:name 是最后一个路径组成部分,不含盘符和根。所以目录部分 exercise/demo_scan 不会出现在 name 里。
如果你需要的是整条路径的字符串,用 str(p) 或直接打印 p,而不是用 name。name 只回答“最后那个文件叫什么”。
这里 report.final.txt 的 suffixes 是 ['.final', '.txt'],说明中间那段 .final 也被算作一个后缀段。这是文档对 suffixes 的定义方式:按点切分,列出所有后缀段。
只读检查:先打印再判断,不动文件
本文所有操作都只读属性,不调用重命名、删除或移动。建议按下面顺序做一次自检:
1. 在练习目录里新建脚本,例如 exercise/path_name_demo.py。
2. 只构造 Path 对象并打印 name、stem、suffix、suffixes 四个属性。
3. 对照本文的对照表,逐行核对输出是否符合预期。
4. 如果某一行对不上,先检查路径字符串里到底有几个点,再检查你用的是 suffix 还是 suffixes。
不要用这些属性直接去改文件名。文档里另有 with_name、with_stem、with_suffix 等方法用于生成新路径,但那属于另一件事,本文不展开,也不执行。
需要提醒的是:这些属性是纯字符串层面的解析,不访问文件系统。也就是说,即使路径指向的文件不存在,name、stem、suffix、suffixes 依然会按字符串规则返回结果。
版本差异与适用限制
有两点版本信息需要说明,避免你在旧版本上得到不同结果。
第一,pathlib 模块从 Python 3.4 开始提供。
第二,文档标注:从 3.14 版本起,单个点(.)被视为有效的后缀。在更早的版本里,如果传入单个点,会触发 ValueError。也就是说,如果你在旧版本上处理以点结尾的名字,行为和 3.14 及以后不一致。
适用范围:本文只读自建 Path 对象,演示 name、stem、suffix、suffixes 四个属性的取值规则,重点在多重后缀。不涉及重命名、删除、移动,不涉及文件读写,也不涉及 glob 匹配。所有路径均为练习用的自建示例,不是对真实文件的检测记录。
观看知识要点视频 18 秒
18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。
参考资料
以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。
请结合原始资料的适用条件阅读。
返回文件整理 →