Преобразование списка в рекурсивный словарь и список значений, если существует один и тот же ключ - PullRequest
0 голосов
/ 16 ноября 2018

Вход

Я получаю входные данные от внешнего источника JSON, который содержит пути. Следуйте этому:

datalake-dev/facial_recognition/
datalake-dev/facial_recognition/curation/google-search-images/this_is_a_dir.png/pic0.jpg
datalake-dev/facial_recognition/curation/google-search-images/this_is_a_dir.png/pic1.jpg
datalake-dev/facial_recognition/curation/google-search-images/this_is_a_dir.png/pic10.png
datalake-dev/facial_recognition/curation/google-search-images/this_is_a_dir.png/pic11.jpg
datalake-dev/facial_recognition/curation/google-search-images/this_is_a_dir.png/pic12.png
datalake-dev/facial_recognition/curation/google-search-images/this_is_a_dir.png/pic13.jpg
datalake-dev/facial_recognition/landing/input-images/
datalake-dev/facial_recognition/landing/input-images/this_is_a_dir.png

Помощь

Исходя из этого, мне нужно передать его в формате API / JSON / Dictionary для дальнейшей обработки. До сих пор я прошел через один , два , три и четыре темы. Ничего не достаточно для решения.

Требуемый вывод

Из путей мне нужно получить формат Dictionary / JSON следующим образом:

{

    "curation":{
        "google-search-images":[
            {
                "name":"pic0"
            },
            {
                "name":"pic1"
            }
        ]
    },
    "derived":{
        "recognition-matches":[
            {
                "name":"img2"
            }
        ],
        "errors":[
            {
                "name":"foo"
            }
        ]
    }

}

В приведенном выше словаре / JSON имена curation, google-search-images, this_is_a_dir.png являются каталогами. Мне нужно что-то, что рекурсивно помещает их в словарь на основе длины этих путей.

My Trial

for contents in result['Contents']:

    directory_or_file_list = contents['Key'].split('/')  # To identify if the path is pointing as file / directory
    path = contents['Key']

    splitted_path = path.split('/')
    # ['datalake-dev', 'facial_recognition', 'landing', 'input-images', 'this_is_a_dir.png', 'pic0.jpg']

    if '' in splitted_path:
        splitted_path.pop()
        all_paths.append(splitted_path)
        # The object 'api' holds the dictionary expected.
        api[splitted_path[0]] = splitted_path[1]
        # api[splitted_path[0]] = {splitted_path[1] : {splitted_path[2] : [append_all_elements_under_this]} }

    if directory_or_file_list[-1].split('.')[-1] in ['jpg', 'jpeg', 'png', 'tiff']:
        print(path)

    else:
        print(path)

Примечание: возможно, есть способ жесткого кода, но тогда я бы не стал публиковать это здесь, это было бы так. Кроме того, нет никаких шансов использовать os.walk (). Там было сделано это. Это не файловая система ОС.

Любая помощь, кроме моего кода приветствуется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...