Как создать дерево папок из списка с путями - PullRequest
1 голос
/ 17 апреля 2019

Я пытаюсь поместить все пути структуры папок, которые мне нужно создать, в список, а затем создать все из них с помощью os.makedirs(), но что-то идет не так. Создаются только заголовочные папки, а не вложенные папки.

def output_folders(trcpaths):
    #trcpath is a list with several paths, example: ['/home/usr/folder1', '/home/usr/folder2']
    global outputfolders
    outputfolders = []
    #Create Paths
    for x, j in enumerate(trcpaths):
        for i in os.listdir(trcpaths[x]):
            if i.endswith('trc'):
                folderpath1 = (j + '/' + i).split('.')[0] #/home/usr/folder1/outputfolder
                folderpath2 = folderpath1 + '/Steps' #/home/usr/folder1/outputfolder/Steps
                folderpath3 = folderpath2 + '/Step_1' #/home/usr/folder1/outputfolder/Steps/Step_1
                folderpath4 = folderpath2 + '/Step_2'
                folderpath5 = folderpath2 + '/Step_3'
                folderpath6 = folderpath2 + '/Step_4'
                folderpath7 = folderpath2 + '/Threshold'

                outputfolders.append(folderpath1)
                outputfolders.append(folderpath2)
                outputfolders.append(folderpath3)
                outputfolders.append(folderpath4)
                outputfolders.append(folderpath5)
                outputfolders.append(folderpath6)
                outputfolders.append(folderpath7)

    #Create Folders
    for j, i in enumerate(outputfolders):
        print(i)
        if os.path.exists(i):
            if j == 0:
                input('The Output-Folder already exists! Overwrite?' )
            shutil.rmtree(i)
            os.makedirs(i)

Хотя, когда я print(i), печатаются правильные пути к папкам, но создаются только «Путь к папке», как /home/usr/folder1/outputfolder, а не все последующие пути к папкам. Почему так?

Вот что я получаю:

/home/usr/folder1/outputfolder
/home/usr/folder2/outputfolder

Но это то, что мне нужно:

/home/usr/folder1/outputfolder
/home/usr/folder1/outputfolder/Steps
/home/usr/folder1/outputfolder/Steps/Step_1
/home/usr/folder1/outputfolder/Steps/Step_2
/home/usr/folder1/outputfolder/Steps/Step_3
/home/usr/folder1/outputfolder/Steps/Step_4
/home/usr/folder1/outputfolder/Steps/Threshold
/home/usr/folder2/outputfolder
/home/usr/folder2/outputfolder/Steps
/home/usr/folder2/outputfolder/Steps/Step_1
/home/usr/folder2/outputfolder/Steps/Step_2
/home/usr/folder2/outputfolder/Steps/Step_3
/home/usr/folder2/outputfolder/Steps/Step_4
/home/usr/folder2/outputfolder/Steps/Threshold

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

, чтобы сохранить вашу логику и код, с этим кодом:

for j, i in enumerate(outputfolders):
    print(i)
    if os.path.exists(i):
        if j == 0:
            input('The Output-Folder already exists! Overwrite?' )
        shutil.rmtree(i)
        os.makedirs(i)

вы не создаете папку .. вы только удаляете существующую папку и воссоздаете ее, если она уже существует

Я добавлю еще, чтобы завершить операцию:

for j, i in enumerate(outputfolders):
    print(i)
    if os.path.exists(i):
        if j == 0:
            input('The Output-Folder already exists! Overwrite?' )
        shutil.rmtree(i)
        os.makedirs(i)
    else:
        os.makedirs(i)
0 голосов
/ 17 апреля 2019

Попробуйте это (протестировано на моей машине с Windows, но должно работать и на Linux)

import os

NUM_OF_STEPS = 5


def make_output_folders(trc_paths):
    output_folders = []
    for idx, path in enumerate(trc_paths):
        for leaf in os.listdir(path):
            if leaf.endswith('trc') and os.path.isdir(os.path.join(path, leaf)):
                trc_folder = os.path.join(path, leaf)
                output_folders.append(os.path.join(trc_folder, 'output_folder', 'Steps'))
                steps_folder = output_folders[-1]
                for x in range(1, NUM_OF_STEPS):
                    output_folders.append(os.path.join(steps_folder, 'Step_{}'.format(x)))
                output_folders.append(os.path.join(trc_folder,'output_folder', 'Threshold'))

        for _path in output_folders:
            print(_path)
            if not os.path.exists(_path):
                os.makedirs(_path)
        output_folders = []


# 'folder_1' contains a sub folder named '1_trc' 
# 'folder_2' contains a sub folder named '2_trc'
make_output_folders(['c:\\temp\\55721430\\folder1', 'c:\\temp\\55721430\\folder2'])
...