pin_drop当前位置:知识文库 ❯ 图文
os.makedirs递归创建多层目录 - Python文件夹创建教程
一、函数概述
os.makedirs() 函数用于递归创建多层目录。与 os.mkdir() 不同,当父目录不存在时,os.makedirs() 会自动创建所有必要的父目录,类似于 Linux 的 mkdir -p 命令。
例如,要创建路径 a/b/c,如果 a 和 a/b 都不存在,os.makedirs() 会依次创建 a、a/b、a/b/c,而 os.mkdir() 则会因为 a 不存在而失败。
二、语法与参数
语法
代码示例
os.makedirs(name, mode=0o777, exist_ok=False)参数说明
返回值
无返回值。
三、基本用法示例
递归创建多层目录
代码示例
import os
path = 'project/src/utils'
os.makedirs(path, exist_ok=True)
print(f"目录创建成功: {path}")
print(f"目录存在: {os.path.exists(path)}")输出:
代码示例
目录创建成功: project/src/utils
目录存在: True四、使用exist_ok避免报错
exist_ok 参数控制目录已存在时是否抛出异常:
代码示例
import os
path = 'data/output'
os.makedirs(path, exist_ok=True)
print("第一次创建成功")
os.makedirs(path, exist_ok=True)
print("第二次创建也成功(exist_ok=True)")
try:
os.makedirs(path, exist_ok=False)
except FileExistsError:
print("exist_ok=False时目录已存在会报错")输出:
代码示例
第一次创建成功
第二次创建也成功(exist_ok=True)
exist_ok=False时目录已存在会报错小贴士
建议始终使用 exist_ok=True,这样可以避免竞态条件(两个进程同时检查并创建同一目录时的冲突),代码也更加简洁。
五、按日期创建目录结构
这是一个常见的日志系统目录创建场景:
代码示例
import os
from datetime import datetime
today = datetime.now()
path = os.path.join('logs', str(today.year), f"{today.month:02d}", f"{today.day:02d}")
os.makedirs(path, exist_ok=True)
print(f"日志目录: {path}")输出:
代码示例
日志目录: logs\2025\04\11六、实际应用场景
-
场景1:在日志系统中按年/月/日创建目录结构存储日志文件
-
场景2:在项目脚手架工具中一次性创建完整的项目目录结构
-
场景3:在文件管理系统中,根据文件类型和日期自动创建分类目录
七、注意事项
注意:exist_ok=True是Python 3.2+新增的参数,建议始终使用以避免竞态条件。
注意:os.makedirs()会创建路径中所有不存在的中间目录。
注意:注意mode参数仅影响最终创建的目录,中间目录的权限可能不同。
八、os.makedirs()与os.mkdir()对比
九、小结
-
os.makedirs()可递归创建多层目录,是os.mkdir()的增强版
-
exist_ok=True可避免目录已存在时的FileExistsError
-
推荐使用os.makedirs()替代os.mkdir(),更安全更方便
十、练习题
练习1
编写程序,创建一个三层嵌套的目录结构 'a/b/c',并在最内层创建一个文本文件。
练习2
编写一个函数,接收路径字符串,使用os.makedirs()创建目录,并处理各种异常情况。
常见问题
os.makedirs()和os.mkdir()应该优先使用哪个?
推荐使用os.makedirs(exist_ok=True)。它可以处理单层和多层目录的创建,且exist_ok参数可以避免目录已存在时的异常,代码更加健壮。os.mkdir()适用于明确只需要创建单层目录且需要精确控制创建过程的场景。
exist_ok=True 在什么版本的Python中可用?
exist_ok参数从Python 3.2版本开始引入。目前Python 2已经停止维护,所有现代Python版本(3.2+)都支持此参数。如果使用Python 2,需要在创建前手动检查目录是否存在。
os.makedirs()可以创建空路径吗?
不能。传入空字符串或'.'作为路径会抛出异常。如果要确保当前目录存在,不需要任何操作,因为当前目录必然存在。os.makedirs()至少要创建一个目录名。
如何只获取os.makedirs()实际创建的最深层目录?
os.makedirs()本身不返回创建的目录列表。如果需要获取实际创建的目录,可以在创建前记录已存在的父目录,创建后再对比。或者使用pathlib模块,通过Path.exists()和Path.mkdir(parents=True)来更精细地控制。
本文涉及AI创作
内容由AI创作,请仔细甄别