默认情况下os.makedirs在目录已存在时抛出FileExistsError;设exist_ok=True则静默跳过,仅确保目录存在而不替换或修改原有内容。

os.makedirs 会报错说目录已存在?用 exist_ok=True
默认情况下,os.makedirs 在目标路径已存在时直接抛出 FileExistsError。这不是“失败”,而是设计如此——它本意是“创建新目录结构”,不是“确保目录存在”。如果你只是想“保证路径可用”,不管它原来有没有,就必须显式传 exist_ok=True。
常见错误现象:FileExistsError: [Errno 17] File exists: 'a/b/c',尤其在反复运行脚本、或多个进程可能并发创建同一路径时高频出现。
-
exist_ok=False(默认):路径存在 → 报错;适合需要严格校验“全新创建”的场景 -
exist_ok=True:路径存在 → 安静跳过;适合初始化日志目录、缓存路径等幂等操作 - 注意:该参数从 Python 3.2 才加入,旧版本需手动捕获异常再忽略
递归创建时权限控制:mode 参数只影响最深层目录
os.makedirs 的 mode 参数(如 0o755)**仅作用于最末端的目录**,中间父目录仍按系统 umask 默认创建。这意味着你设了 mode=0o700,但 a/b/ 可能仍是 755,只有 a/b/c 是 700。
如果需要统一权限,得自己遍历路径逐级设置,或者改用 os.chmod 补全:
立即学习“Python免费学习笔记(深入)”;
import os
os.makedirs('a/b/c', exist_ok=True)
for root, dirs, _ in os.walk('a'):
for d in dirs:
os.chmod(os.path.join(root, d), 0o700)
不过多数情况无需这么严格——只要最终目录权限正确,中间路径读权限通常不影响使用。
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
和 os.mkdir 的关键区别:不支持 exist_ok 且只建一级
os.mkdir 无法递归,也不能容忍路径已存在——哪怕只差一级,比如 'a/b' 不存在而 'a' 存在,它也会报 FileNotFoundError。这时候必须用 os.makedirs。
-
os.mkdir('a/b')→ 报错(因为a下没有b,且mkdir不递归) -
os.makedirs('a/b')→ 成功(自动建a再建b) -
os.makedirs('a/b', exist_ok=True)→ 无论a/b是否存在都无事发生
别试图用 os.mkdir 加 try/except 模拟递归——容易漏掉中间层级,逻辑比直接用 os.makedirs 复杂得多。
Windows 下路径分隔符与反斜杠陷阱
在 Windows 上,如果你手写路径字符串用了单反斜杠('a\b\c'),Python 会把它当转义字符处理,\b 变成退格符,\c 直接报错 SyntaxError。正确做法是:
- 用正斜杠:
os.makedirs('a/b/c')(所有平台都认) - 用原始字符串:
os.makedirs(r'a\b\c') - 用
os.path.join拼接:os.makedirs(os.path.join('a', 'b', 'c'))
另外,os.makedirs 内部会自动处理路径分隔符标准化,所以传入 'a/b/c' 在 Windows 下也会生成 a\b\c 目录,不用手动转换。
真正容易被忽略的是:exist_ok=True 不会修复权限冲突或只读文件系统问题,它只忽略“已存在”这一种错误。如果磁盘满、没写权限、路径里有非法字符,照样抛异常。

















