python - 使用带有递归的 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。
注意:如果树结构中的文件夹名称与代码不匹配,请忽略。这只是一个例子。
解决方案
每当您调用函数时,都需要将新路径传递给函数而不是基本路径
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)
推荐阅读
- python - 如何打破python列表中的元素
- javascript - 'source.connect()' 不是函数 - Web 音频 API
- php - PHP数组到字符串(array_push)
- swift - 如何删除除一种类型之外的所有对象?
- sql - 数据框转换(准备 sql 导出)
- flutter - 颤振删除列中行之间的空格
- docker - 连接到在 windows docker 容器中运行的服务器
- amazon-ec2 - CFN 采用最新的 AMI 并启动 EC2 实例
- java - 在 Lambda 表达式中从 main() 抛出 IOException
- javascript - 如果未单击单选按钮,则在提交按钮上显示错误消息