Python如何创建可变深度递归嵌套目录并支持目录内文件复制
自适应嵌套目录创建方案
问题分析
你当前的实现硬编码了三层循环逻辑,仅支持固定深度的目录创建,无法适配后续新增的更深层级嵌套,也没有实现目标目录下的文件复制功能。采用递归遍历嵌套结构的方案可以完美解决自适应深度的需求。
实现方案
结构约定
我们统一目录结构的定义规则,保证任意深度嵌套都能被识别:
- 整体用嵌套字典定义目录树,字典的key为目录名称
- 若字典的value为dict类型,代表当前目录下还有下级子目录
- 若字典的value为list类型,代表当前目录为叶子目录,列表内存储需要复制到该目录的源文件绝对/相对路径,空列表代表该目录不需要复制文件
完整代码
import os import shutil def create_dir_structure(parent_path, struct_node): # 遍历当前层级的所有目录节点 for dir_name, sub_node in struct_node.items(): # 拼接当前目录的完整路径 current_dir = os.path.join(parent_path, dir_name) # 创建目录,已存在则自动跳过 os.makedirs(current_dir, exist_ok=True) if isinstance(sub_node, dict): # 子节点是字典,递归创建下级目录 create_dir_structure(current_dir, sub_node) elif isinstance(sub_node, list): # 子节点是列表,遍历复制文件到当前目录 for src_file in sub_node: if os.path.isfile(src_file): shutil.copy2(src_file, current_dir) else: print(f"源文件不存在,跳过复制:{src_file}") if __name__ == "__main__": root_path = './test' # 支持任意深度嵌套的目录结构定义,新增层级仅需修改此处 directories = { 'Block_models': [], 'Borehole_data': [], 'Design_data': [], 'Grid_models': { 'Assay': { 'Raw': { '2024': ['/source/raw_2024_1.csv', '/source/raw_2024_2.csv'], '2023': [] }, 'Wash': ['/source/wash_1.csv', '/source/wash_2.csv'] }, 'Structure': { 'f1': [], 'f2': [], 'f3': [], 'f4': [] } }, 'Map_files': { 'Assay': [], 'Structure': { 'f1': [], 'f2': [], 'f3': [], 'f4': [] } }, 'Spec_files': [], 'Triangulations': { 'Faults': [], 'Structure': [], 'Topography': [] } } create_dir_structure(root_path, directories)
代码说明
- 自适应任意嵌套深度,后续要新增子目录仅需修改
directories嵌套字典即可,无需调整逻辑代码 - 内置目录存在判断,不会因目录已存在报错中断执行
- 文件复制前会校验源文件有效性,无效文件仅打印提示不会导致程序崩溃
- 可根据需求调整文件复制逻辑,比如新增重名文件重命名、覆盖提示等规则
内容的提问来源于stack exchange,提问作者Brett McGregor
相关产品推荐
相关产品推荐

