首页 > 解决方案 > 使用带有递归的 Python 构建目录结构

问题描述

我正在尝试使用 Python 构建以下结构

├───Baseframework
│   ├───0_src
│   │   ├───Appfun
│   │   │   ├───Cpugeneric
│   │   │   ├───i5t
│   │   │   ├───Tricore
│   │   │   └───vpprint
│   │   └───Base
│   │       ├───gnfru
│   │       ├───ills
│   │       └───service
│   ├───1_toolbar
│   │   └───0_build
│   │       ├───0_utilites
│   │       ├───1_config
│   │       └───9_make
│   └───2_out
│       ├───tasking
│       └───tricore

这是我的代码

import os
import argparse


base_path = "c:/usr"

# level_zero = "Baseframework"
levels = {"Baseframework":{"0_src":{"Appfun":["Cpugeneric", "i5t", "Tricore", "vpprint"], "Base":["ills","gnfru","service"]},
                           "1_toolbar":{"0_build":["0_utilities", "1_config", "9_make"]},
                           "2_out": ["ist_tasking","tricore_gyne"]}}

def iterdict(d, bd, flag = 1):

    for k,v in d.items():
        if isinstance(v, dict):
            print(flag)
            if flag==1:
                bd = os.path.join(bd,k)
                print(bd)
            else:
                bd = os.path.join(os.path.abspath(bd+"/.."),k)
                print(bd)

            if not os.path.exists(bd):
                    os.mkdir(bd)
            iterdict(v, bd)
        elif isinstance(v, list):
            bd1 = os.path.join(bd, k)
            if not os.path.exists(bd1):
                os.mkdir(bd1)
            for i in v:
                os.mkdir(os.path.join(bd1, i))
            flag = 0

iterdict(levels, base_path)

上面的代码创建了一个结构:

├───Baseframework
│   └───0_src
│       ├───1_toolbar
│       │   ├───0_build
│       │   │   ├───0_utilities
│       │   │   ├───1_config
│       │   │   └───9_make
│       │   └───2_out
│       │       ├───ist_tasking
│       │       └───tricore_gyne
│       ├───Appfun
│       │   ├───Cpugeneric
│       │   ├───i5t
│       │   ├───Tricore
│       │   └───vpprint
│       └───Base
│           ├───gnfru
│           ├───ills
│           └───service

逻辑与解释:

每当我遇到时list,我都会进行设置flag=False,以便在 value 为 时可以后退 1 步进行下一次迭代dict

但不幸的是,flag变量的值没有改变。我无法理解为什么值没有改变它总是1。

注意:如果树结构中的文件夹名称与代码不匹配,请忽略。这只是一个例子。

标签: pythonpython-3.xdictionaryrecursion

解决方案


每当您调用函数时,都需要将新路径传递给函数而不是基本路径

import os
import argparse


base_path = r"<base directory path>"

# level_zero = "Baseframework"
levels = {"Baseframework":{"0_src":{"Appfun":["Cpugeneric", "i5t", "Tricore", "vpprint"], "Base":["ills","gnfru","service"]},
                           "1_toolbar":{"0_build":["0_utilities", "1_config", "9_make"]},
                           "2_out": ["ist_tasking","tricore_gyne"]}}

def func(data, path):
    new_path = ''
    if isinstance(data, dict):
        for k, v in data.items():
            new_path = os.path.join(path, k)
            os.mkdir(new_path)
            func(v, new_path)
    elif isinstance(data, list):
        for _dir in data:
            new_path = os.path.join(path, _dir)
            os.mkdir(new_path)
    else:
        exit(0)

func(levels, base_path)

推荐阅读