如何创建特定的文件夹/子文件夹树?

时间:2017-01-20 21:22:55

标签: python

我正在尝试使用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()

1 个答案:

答案 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")