Как перебирать списки в списках в Python, не зная глубину каталога? - PullRequest
0 голосов
/ 24 марта 2020

У меня есть API, к которому я обращаюсь, который имеет глубокую структуру папок. Я не знаю глубины структуры папок (определенно больше, чем 4 уровня, и каждая папка имеет разную глубину), но я хочу получить все имена папок, подпапок и поместить их в диктовку. Поскольку каждая папка имеет имя и идентификатор, и я могу получить доступ только к папке с идентификатором, но для ее использования необходимо сопоставить имя. Я все еще далек от того, чтобы быть опытным программистом, поэтому я надеюсь, что кто-то может помочь мне с этим. Как я сталкивался с этой проблемой несколько раз с разными API. Как я должен для-l oop, когда я не знаю, сколько существует уровней подпапок?

folder_ids = []
folder_names = []
folders_dict = {}

response_list = client.get_asset_children(assetid) # Get subfolder and files from asset with API
assets = response_list.results

for item in assets:
    folder_ids.append(item['id'])
    folder_names.append(item['name'])

folder_dict.update(dict(zip(folder_names, folder_ids)))

Ответы [ 2 ]

1 голос
/ 24 марта 2020
from pathlib import Path

path = Path("root")

for item in path.glob("**"):
    if item.is_dir():
        print(item)

Вывод (с макетом «root» dir, содержащим подпапки):

root
root\a
root\a\deeper
root\a\deeper\even deeeeeper
root\b
root\c
root\c\foo
0 голосов
/ 24 марта 2020

Это очень медленно "около 40 секунд", но это первое решение, которое сработало. Я надеюсь, что вы, ребята, можете помочь мне решить эту головоломку с более быстрым кодом. Я использовал рекурсивную функцию.

def get_subassets(assetid): # Version 004
    """List Assets"""
    response_list = client.get_asset_children(assetid)
    assets = response_list.results

    global assets_dict  # Create a global variable for assets dictionary
    assets_dict = {}  # Create the empty assets dictionary

    for item in assets:
        if item['type'] == 'folder':
            all_folders.append(item['name'])
            get_subassets(item['id'])
            # print("It's a folder: ", item['name'])
        if item['type'] == 'file':
            all_files.append(item['name'])
            # print("It's a file:   ", item['name']
...