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 参数,需要手动判断 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__ 定位,避免启动目录不同导致行为不一致。