path.mkdir(parents=true, exist_ok=true)可一次性安全创建多层目录:parents=true自动创建缺失的父目录,exist_ok=true避免目录已存在时抛出异常。

用 Path.mkdir() 一次性创建多层目录
直接调用 Path.mkdir() 并传入 parents=True,就能自动创建路径中所有不存在的父目录。不加这个参数时,只要上级目录缺一层,就会抛出 FileNotFoundError。
常见错误现象:执行 Path("a/b/c").mkdir() 报错 FileNotFoundError: No such file or directory,因为 a 和 a/b 都不存在。
-
Path("logs/2024/06/15").mkdir(parents=True)—— 安全创建完整路径 - 如果目录已存在,默认会报
FileExistsError;加exist_ok=True可静默跳过 - 组合使用更稳妥:
Path("out/data/json").mkdir(parents=True, exist_ok=True)
为什么不用 os.makedirs()?
pathlib 的优势不是功能更多,而是路径操作更连贯。比如你已有 p = Path("src") / "test" / "fixtures",后续直接 p.mkdir(parents=True) 即可,不用再拼字符串或转成字符串传给 os.makedirs()。
性能上无明显差异,但可读性提升明显——尤其在路径动态拼接场景下。
- 错误写法:
os.makedirs(str(p)),多此一举且丢失类型语义 - 正确写法:
p.mkdir(parents=True),类型安全、链式自然 - 注意:
os.makedirs()默认也支持exist_ok=True,但pathlib把它作为显式参数,意图更清晰
权限控制和中间目录的 umask 影响
mkdir() 创建的目录默认权限受系统 umask 限制,不是严格按 0o755 生效。比如 umask 是 0o022,那实际新建目录权限就是 0o755 & ~0o022 = 0o755;但如果 umask 是 0o002,结果就是 0o755(因为写权限被 mask 掉了)。
- 想强制设权限,加
mode=0o755参数,但注意它只影响最末级目录,中间父目录仍受 umask 约束 - 跨平台时注意:Windows 忽略
mode参数,所以不要依赖它做权限校验 - 生产脚本中若需精确权限,建议创建后用
p.chmod(0o755)单独设置最末级目录
嵌套太深时的隐性风险
路径层级过深(比如超过 15 层)本身不会报错,但可能触发某些文件系统或容器环境的限制。更常见的是路径拼写错误导致意外创建在错误位置,比如 Path("../tmp/output") 没注意相对路径起点。
- 建议创建前先用
p.resolve()查看绝对路径,确认目标位置是否符合预期 - 对用户输入的路径,务必用
Path().is_absolute()或.resolve().is_relative_to(Path.cwd())做白名单校验,防止路径遍历 -
mkdir()不会覆盖已有文件,但如果同名路径是文件而非目录,会直接报NotADirectoryError,这个错误容易被忽略
parents=True 和 exist_ok=True 这两个参数的组合方式,就决定了脚本能稳定运行还是随机崩在某个 CI 环境里。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











