Python 中如何安全地创建多级(嵌套)目录?
Python 创建嵌套目录推荐 pathlib 的 mkdir(parents=True, exist_ok=True),会创建缺失的父目录,已有目录可复用;权限和同名文件冲突仍可能报错。本文对比 pathlib 与 os.makedirs 的用法。
推荐写法:Path('/a/b/c').mkdir(parents=True, exist_ok=True)。parents=True 自动创建缺失的父目录,exist_ok=True 让目录已存在时不报错,可避免常见先查再建竞态,但不是无条件安全或原子事务。
方法一:pathlib(Python 3.5+,推荐)
from pathlib import Path
p = Path('/root/directory/nested_directory')
p.mkdir(parents=True, exist_ok=True)
- 不加
parents=True:父目录不存在会抛FileNotFoundError。 - 不加
exist_ok=True:目标已存在会抛FileExistsError。
方法二:os.makedirs
import os
os.makedirs('/root/directory/nested_directory', exist_ok=True)
效果相同。注意 Python 3.2 之前 os.makedirs 没有 exist_ok 参数,可捕获创建时的 EEXIST 并验证目标是否目录,不能只依靠 os.path.exists(),存在竞态问题(判断和创建之间目录可能被其他进程创建),所以现代代码应始终用 exist_ok=True。
常见错误写法
# 错误:先判断再创建,存在竞态条件
if not os.path.exists(path):
os.makedirs(path)
正确姿势就是一句带 exist_ok=True 的调用,递归创建缺失目录;整个多级操作并不原子,失败时可能留下部分父目录,且同名文件等冲突仍会报错。
常见问题(FAQ)
Q:mkdir 和 makedirs 有什么区别?
A:Path.mkdir() 默认只创建最后一级;os.makedirs() 默认递归创建所有缺失层级。加上 parents=True 后两者行为一致。
Q:创建时想顺便设置权限?
A:两个函数都有 mode 参数(如 mode=0o755),但注意最终权限还受 umask 影响,且中间层目录不应用该 mode。
Q:相对路径可以吗?
A:可以,相对当前工作目录解析。生产代码建议用绝对路径或基于 __file__ 定位,避免启动目录不同导致行为不一致。