【问题标题】:How to create folder tree from list with paths如何从带有路径的列表中创建文件夹树
【发布时间】:2019-09-07 08:08:21
【问题描述】:

我正在尝试将需要创建的文件夹结构的每个路径放入一个列表中,然后使用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

【问题讨论】:

  • 您使用的确切 python 版本是什么?我在问,因为 os.makedirs() 行为完全依赖于版本。见docs.python.org/3/library/os.html#os.makedirs
  • Python 3.6.7,我在帖子里编辑过
  • 什么是trcfilename - 它是一个文件夹吗?
  • 是的。它是一个与文件同名的文件夹。我正在分析 trc 文件并希望输出文件夹与输入文件具有相同的名称。对困惑感到抱歉。我把它改成了/outputfolder

标签: python-3.x operating-system


【解决方案1】:

使用此代码保留您的逻辑和编码:

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来完成操作:

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)

【讨论】:

    【解决方案2】:

    试试这个(在我的 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'])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多