2016-12-22 3 views
0

У меня очень нерегулярный список список, содержащий структуру папок, и я хочу итерацию по списку и проверить, существует ли эта папка/подпапка или неTraverse нерегулярный список список

folderStructure = [['Folder1', [subfolder1, [sub-sub-folder1, sub-sub-folder2]]], ['Folder2', [sub-folder2], [sub-folder3]], ['Folder3', [sub-folder4]], ['Folder4'], [file1, file2, file3]] 

Как Я проверяю, существует ли такая структура папок?

+0

это кажется несколько неоднозначной структурой для хранения пути, он предположил, что если список где-то в структуре содержит два элемента, а второй один список, то первого является подпапкой и вторым список элементов, вложенных в эту папку? –

ответ

1

Чтобы проверить, существует ли папка, вы должны указать ее путь и использовать os.path.exists. Трудная часть состоит в том, что вложенные списки имеют строки, которые иногда представляют собой имя папки, а другое - имя файла. Я написал функцию, которая проверяет, существуют ли элементы предоставленной структуры или нет, и пытается определить, представляет ли контент имя папки или нет.

import os 
folderStructure = [ 
    ['Folder1', 
     ['subfolder1', 
      ['sub-sub-folder1', 'sub-sub-folder2'] 
     ] 
    ], 
    ['Folder2', 
     ['sub-folder2'], ['sub-folder3'] 
    ], 
    ['Folder3', 
     ['sub-folder4'] 
    ], 
    ['Folder4'], 
    ['file1', 'file2', 'file3'] 
] 

def path_hierarchy_exists(pathslist,base_path='.'): 
    print pathslist,base_path 
    if isinstance(pathslist,basestring): # pathslist is a string that names a file 
     return os.path.exists(os.path.join(base_path,pathslist)) 
    elif len(pathslist)==1: # Leaf sub-folders or leaf files 
     if not path_hierarchy_exists(pathslist[0],base_path): 
      return False 
    elif isinstance(pathslist[0],basestring) and isinstance(pathslist[1],list): 
     # pathslist is a list starting with the folder name and following with a list of folder contents 
     folderName = pathslist[0] 
     if not os.path.exists(os.path.join(base_path,folderName)): # Folder does not exist 
      return False 
     for folderContents in pathslist[1:]: 
      if not path_hierarchy_exists(folderContents,os.path.join(base_path,folderName)): 
       return False # Folder contents do not exist 
    else: # pathslist is a list of nested folders 
     for paths in pathslist: 
      if not path_hierarchy_exists(paths,base_path): 
       return False 
    return True 

print(path_hierarchy_exists(folderStructure)) 
0

Я не уверен, что такое подпапки, но это будет работать, если вы ищете строку в массиве неправильной формы. Вы должны попробовать и понять, что это делает, читая около глубину первого поиска.

folderStructure = [ 
    ['Folder1', 
     ['subfolder1', 
      ['sub-sub-folder1', 'sub-sub-folder2'] 
     ] 
    ], 
    ['Folder2', 
     ['sub-folder2'], ['sub-folder3'] 
    ], 
    ['Folder3', 
     ['sub-folder4'] 
    ], 
    ['Folder4'], 
    ['file1', 'file2', 'file3'] 
] 

def searchFolder(folder, name): 
    for item in folder: 
     if isinstance(item, basestring): 
      if item == name: 
       return True 
     elif searchFolder(item, name): 
      return True 

    return False 

print searchFolder(folderStructure, 'Folder4') 

Передача папки Структура как первый параметр и имя папки, которую вы ищете как вторую.

+0

Не могли бы вы уточнить, что такое «папка» и «имя» в разделе аргументов ... Я могу передать полный список как «папку», но что такое «имя»? – atg

+0

Я отредактировал мой код и удостоверился, что он работает, а также предоставил пример того, как вызвать функцию. Я не был уверен, какой тип данных является «подпапкой», поэтому я заменил их строками. Если они не являются хранимыми типами folderStructure, вам придется компенсировать это. –

+1

Довольно уверен, что 'isinstance (s, basestring)' считается лучшей практикой для тестирования, если var является строкой в ​​Python 2 – brianpck

Смежные вопросы