pathlib.path 的 parent 和 name 属性可直接获取父目录与文件名,parent 返回 path 对象支持链式调用,name 返回含扩展名的文件名,stem 和 suffix 分别获取纯文件名与扩展名;parents 元组支持索引访问多级父目录,更安全易读。

用 parent 和 name 属性直接取父目录与文件名
不用拼字符串、不调 os.path,pathlib.Path 的 parent 和 name 是最直白的解法。它们返回的是 Path 对象(parent)或字符串(name),类型清晰,链式调用自然。
-
path.parent返回上一级目录,是Path对象,可继续链式访问,比如path.parent.parent -
path.name返回不含路径的文件名(含扩展名),如"config.json" - 若要纯文件名(不含扩展名),用
path.stem;扩展名单独用path.suffix - 注意:
path.parent在根目录(如Path("/"))时仍返回自身,不会报错但可能不符合预期
示例:
from pathlib import Path
p = Path("/home/user/docs/report.pdf")
print(p.parent) # /home/user/docs
print(p.name) # report.pdf
print(p.stem) # report
print(p.suffix) # .pdf
获取多级父目录别硬写 .parent.parent...
连续写多个 .parent 看着累,还容易数错层级。用 parents 这个只读元组更稳——索引从 0 开始,parents[0] 是直接父目录,parents[1] 是祖父目录,以此类推。
-
path.parents[n]相当于path.parent.parent... (n+1 次),但更易读、不易出错 -
len(path.parents)能知道最多能往上几级(到根为止),避免IndexError - 如果不确定层级深度,建议先检查
if n 再取值
示例:
p = Path("/a/b/c/d.txt")
print(p.parents[0]) # /a/b/c
print(p.parents[2]) # /a
print(p.parents[3]) # / (根目录)
# 超出范围会 IndexError,所以:
if 4 <h3>区分 <code>resolve()</code> 和普通 <code>parent</code>:符号链接是否跟随</h3><p>默认情况下,<code>parent</code> 不解析符号链接,它按字面路径向上找;而 <code>resolve()</code> 会追踪符号链接并返回真实路径。两者混合使用时容易误判“父目录”到底指哪一层。</p>
- 比如
Path("/symlink").parent返回Path("/"),不管/symlink实际指向哪 - 但
Path("/symlink").resolve().parent返回的是真实目标路径的父目录 - 常见陷阱:日志路径、配置加载时依赖父目录,却因符号链接导致
parent指向错误位置 - 若需稳定行为,明确决定是否调用
.resolve()—— 多数脚本场景建议先resolve()再取parent
Windows 下盘符和 UNC 路径的 parent 行为差异
Windows 的路径结构让 parent 表现和 Unix 不同,尤其在盘符根和网络路径上,容易踩坑。
-
Path("C:/").parent返回Path("C:/")(即自身),不是Path("C:")或空 -
Path("//server/share").parent返回Path("//server"),不是Path("//server/share")自身 -
Path("C:/a/b").parent.parent.parent最终停在Path("C:/"),再往上仍是它 - 跨平台代码中,不要假设
parent一定能“退出”盘符或 UNC 根;必要时用is_absolute()和anchor判断边界
真正麻烦的是:这些行为在文档里没加粗强调,但实际运行时才暴露。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











