如何使用Django Python创建文件夹及子文件夹(附代码示例)
Django运行时动态创建文件夹及嵌套子文件夹实现方法
这个场景不需要找Django专属API,Django本身没有重复封装文件系统操作能力,直接用Python标准库的文件路径操作方法就可以实现,和普通Python脚本创建目录的逻辑基本一致,只需要注意路径拼接不要硬编码、做好异常兼容即可。
核心实现要点
- 路径拼接优先使用Django配置项
BASE_DIR(项目根路径)、MEDIA_ROOT(媒体文件根路径)作为基准,不要写死系统绝对路径,避免跨环境部署时路径失效 - 创建目录时开启「目录已存在不报错」参数,避免重复执行逻辑时抛出异常
- 创建多层嵌套目录时直接使用递归创建能力,不需要逐层手动判断、逐层创建
代码示例
兼容性写法(适配所有Python3版本,基于os模块)
import os from django.conf import settings def init_runtime_dirs(): # 定义要创建的根目录,示例为媒体目录下的user_uploads文件夹 root_path = os.path.join(settings.MEDIA_ROOT, "user_uploads") # 定义根目录下需要创建的一级子文件夹 child_dir_list = ["avatar", "attachment", "temp_export"] # 递归创建根目录,exist_ok=True表示目录已存在时不触发报错 os.makedirs(root_path, exist_ok=True) # 批量创建一级子目录 for dir_name in child_dir_list: child_path = os.path.join(root_path, dir_name) os.makedirs(child_path, exist_ok=True) # 多层嵌套目录(如 user_uploads/category/2024/09)直接拼完整路径调用即可 # makedirs会自动创建路径中所有不存在的父级目录 nested_path = os.path.join(root_path, "category", "2024", "09") os.makedirs(nested_path, exist_ok=True)
简洁写法(Python3.4+支持,基于pathlib模块)
Django 3.1及以上版本中settings.BASE_DIR、settings.MEDIA_ROOT默认是Path对象,用pathlib操作路径更简洁:
from pathlib import Path from django.conf import settings def init_runtime_dirs(): root_path = settings.MEDIA_ROOT / "user_uploads" child_dir_list = ["avatar", "attachment", "temp_export"] # parents=True开启递归创建父目录,exist_ok=True表示目录存在不报错 root_path.mkdir(parents=True, exist_ok=True) for dir_name in child_dir_list: (root_path / dir_name).mkdir(parents=True, exist_ok=True) # 多层嵌套目录创建 nested_path = root_path / "category" / "2024" / "09" nested_path.mkdir(parents=True, exist_ok=True)
注意事项
- 启动Django服务的系统用户,必须对目标路径的父级目录拥有写入权限,否则会抛出
PermissionError- 如果创建的目录用于存放用户上传的媒体文件,记得配置好Django的MEDIA路由,否则目录下的文件无法通过HTTP访问
- 运行时生成的动态文件不要放在Django项目源码目录下,统一放到
MEDIA_ROOT或者单独配置的数据目录,避免误提交到代码仓库
内容的提问来源于stack exchange,提问作者abby
相关产品推荐
相关产品推荐

