pathlib 用 / 拼接路径更直观且自动处理分隔符,需用 / 而非 +;resolve() 比 absolute() 更可靠,会真实访问文件系统;读写前须 exists() 和 is_file() 双检;glob()/rglob() 简洁但不匹配隐藏文件;write_text() 前需手动创建父目录。

用 / 操作符拼接路径比 os.path.join() 更直观
pathlib 的核心优势在于把路径当对象处理,而不是字符串。用 / 拼接路径不仅可读性强,还能自动处理分隔符和冗余斜杠问题,避免手写 os.path.join("a", "b", "c") 的嵌套调用。
常见错误是把字符串直接和 Path 对象相加(path + "file.txt"),这会报 TypeError;必须用 /。
from pathlib import Pathbase = Path("/home/user")-
full = base / "data" / "config.json"→PosixPath('/home/user/data/config.json') - 支持混合类型:
base / "logs" / Path("app.log")也合法
解析路径时优先用 resolve() 而非 absolute()
absolute() 只是补全开头的 . 或 ..,不检查文件是否存在;而 resolve() 会真实访问文件系统,展开符号链接、消除 ..、验证路径有效性——这才是你真正需要的“解析”行为。
典型坑:在 CI 环境或容器里,absolute() 返回一个看似合理但实际不存在的路径,后续 open() 才失败,排查困难。
-
Path("../../../etc/passwd").absolute()→ 可能返回/home/user/../../../etc/passwd(未规整) -
Path("../../../etc/passwd").resolve()→ 报FileNotFoundError(如果路径无效)或返回真实绝对路径 - 若想静默忽略不存在的路径,加
strict=False参数,但需自行判断返回值是否可靠
读写文件前务必用 exists() 和 is_file() 做双检
pathlib 不会在你调用 read_text() 或 open() 时自动帮你确认目标是文件还是目录。直接操作可能触发 IsADirectoryError 或 PermissionError,错误信息又不够明确。
尤其在处理用户输入或配置路径时,仅靠 exists() 不够:软链接、目录、socket 文件都可能通过该检查。
p = Path("config.yaml")if p.exists() and p.is_file():content = p.read_text()- 对目录操作请用
is_dir(),别依赖后缀名判断
glob() 和 rglob() 替代 os.walk() 更简洁,但注意匹配范围
要找所有 .py 文件?Path(".").rglob("*.py") 一行搞定,返回生成器,不占内存。比 os.walk() + 多层 if 清晰太多。
容易被忽略的是:默认不匹配隐藏文件(以 . 开头),且 glob("*.py") 只查当前目录,rglob() 才递归。另外,通配符不支持正则语法,比如 "[abc].py" 是合法 glob,但 "file_\d+.py" 就不行。
-
list(Path("src").glob("*.py"))→ 当前src/下的 .py 文件 -
list(Path(".").rglob("__init__.py"))→ 整个树中所有__init__.py - 如需排除某些目录(如
venv),得手动过滤:p for p in Path(".").rglob("*.py") if "venv" not in p.parts
write_text() 失败时不会提示 “目录不存在”,得自己调 parent.mkdir(parents=True, exist_ok=True)。这点和字符串路径一样,得写,只是写法更统一。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











