我正在尝试使用Python创建一个非常特定的文件夹树,它将创建预定义的文件夹和子文件夹。我可以创建顶级和二级文件夹,但程序在创建第三级和第四级文件夹时会混乱。它要么不生成这些文件夹,要么将它们放在不正确的位置。我正在尝试使用os.makedirs
并且无法找到比嵌套for
循环更简单的方法,这种循环很混乱并且可能导致所有问题。
import os
topLvl=["1", "2", "3"]
docSecLvl=["Info", "Reports"]
findSecLvl=["Ex", "In", "Ph"]
dataSecLvl=["DB", "Ph", "NM", "Test", "Vul", "App"]
phThrdLvl=["Template", "Payload"]
nm_vulsThrdLvl=["Ex", "In"]
ntmFrthLvl=["Nm", "Eye"]
vulsFrthLvl=["NS"]
appThrdLvl=["2", "3"]
def main():
for dir1 in topLvl:
if dir1=="1":
for dir2 in docSecLvl:
dirmake(dir1, dir2)
if dir1=="2":
for dir2 in findSecLvl:
dirmake(dir1, dir2)
if dir1=="3":
for dir2 in dataSecLvl:
dirmake(dir1, dir2)
if dir2=="Ph":
for dir3 in phThrdLvl:
dirmake(dir2, dir3)
if dir2=="NM":
for dir3 in nm_vulsThrdLvl:
dirmake(dir2, dir3)
if dir3=="Ex":
for dir4 in ntmFrthLvl:
dirmake(dir3, dir4)
if dir3=="In":
for dir4 in ntmFrthLvl:
dirmake(dir3, dir4)
if dir2=="Vul":
for dir3 in nm_vulsThrdLvl:
dirmake(dir2, dir3)
if dir3=="Ex":
for dir4 in vulFrthLvl:
dirmake(dir3, dir4)
if dir3=="In":
for dir4 in vulFrthLvl:
dirmake(dir3, dir4)
if dir2=="App":
for dir3 in appThrdLvl:
dirmake(dir2, dir3)
def dirmake(d1, d2):
try: os.makedirs(os.path.join(d1, d2))
except OSError: pass
main()
答案 0 :(得分:0)
嗯,现有代码最重要的问题是它只是连接两个目录名来创建路径,所以例如“App”和“2”进入路径“App / 2”而不是“3 / App / 2“,应该如此。
此外,使用makedirs()
稍微有点危险,因为它会生成所有中间目录,即使它们由于某种原因而错误且不存在。并且现有的代码很好地证明了,因为它会使两个级别的错误目录没有失败。
我建议使用嵌套字典来表示要创建的树,例如:
NTM_FOURTH_LEVEL = {
"Nm": {},
"Eye": {},
}
VULS_FOURTH_LEVEL = {
"NS": {},
}
DIRECTORY_STRUCTURE = {
"1": {
"Info": {},
"Reports": {},
},
"2": {
"Ex": {},
"In": {},
"Ph": {},
},
"3": {
"DB": {},
"Ph": {
"Template": {},
"Payload": {},
},
"NM": {
"Ex": NTM_FOURTH_LEVEL,
"In": NTM_FOURTH_LEVEL,
},
"Vul": {
"Ex": VULS_FOURTH_LEVEL,
"In": VULS_FOURTH_LEVEL,
},
"App": {
"2": {},
"3": {},
},
},
}
然后你可以使用一个小而优雅的递归函数来创建实际的目录树:
import os
import os.path
def make_dir_tree(tree, prefix=''):
for name, subtree in tree.items():
path = os.path.join(prefix, name)
os.mkdir(path)
make_dir_tree(subtree, prefix=path)
def main():
make_dir_tree(DIRECTORY_STRUCTURE)
if __name__ == '__main__':
main()
作为免费的附加功能,您可以使用prefix参数在您指定的某个目录下创建树,而不是当前目录:
make_dir_tree(DIRECTORY_STRUCTURE, prefix="somewhere/deeper")
make_dir_tree(DIRECTORY_STRUCTURE, prefix="/absolute/path")