跳到正文
效率工具实用笔记关于本站
文件整理

文件名、后缀和完整路径:Path.name、stem与suffix怎么读

约 8 分钟阅读AI 辅助整理

用自建Path对象演示name、stem、suffix和suffixes分别返回什么,重点说明多重后缀下suffix只取最后一段、suffixes返回全部后缀列表,全程只读不重命名。

本文要点

  1. 先在练习目录里构造几个自建路径对象,只打印属性,不碰真实文件

  2. 这是最容易判断错的一处

  3. 下面这张表是编辑根据文档示例整理的对照,供你逐行核对,不是对真实文件的检测记录

文件名、后缀和完整路径:Path.name、stem与suffix怎么读的知识要点示意图
依据已审核正文摘取要点制作的示意图,非实物照片;请结合正文中的条件与范围阅读。要点摘自已审核正文;完整条件与说明见正文。查看高清图解 ↗
本文目录

先分清四个属性各自回答什么问题

假设你在练习目录里有一个自建路径对象,想从它身上读出文件名、主名和后缀。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秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。

参考资料

以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。

请结合原始资料的适用条件阅读。

返回文件整理 →