Как я могу расширить пути к файлам для словаря - PullRequest
3 голосов
/ 18 марта 2020
import plazy


txt_filter = lambda x : True if x.endswith('') else False
file_paths: list = plazy.list_files(root='/data/', filter_func=txt_filter, is_include_root=True)

print(file_paths)

вывод:

 ["/data/subdir1/subdir1_1/file1.txt","/data/subdir2/subdir2_1/file2.txt", "/data/subdir2/subdir2_1/file1.txt", "/data/subdir3/subdir3_1/subdir3_2/file1.txt"]

Как мне расширить эти пути для определенного c словаря. Я хочу, чтобы это выглядело так

{ 
"data": 
    "subdir1" : { "subdir1_1": ["file1.txt"]},
    "subdir2" : { "subdir2_1": ["file1.txt", "file2.txt"]},
    "subdir3" : { "subdir3_1":
                     { "subdir3_2": ["file1.txt"]}
                 }
}

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

Я думаю, что один из способов решения этой проблемы - сначала использовать plazy.list_files на ограниченной глубине (для получения каталогов верхнего уровня) и выполнить рекурсию вручную, вместо того, чтобы позволить ему получить все дерево.

Некоторый псевдокод чтобы проиллюстрировать ...

topdirs = getdirs(/root)

foreach dir
  children = getdirs(/dir)
  leaves = gettxtfiles(/dir/)

Когда ваша программа возвращается в структуру, она строит ее так, как вы хотите.

0 голосов
/ 18 марта 2020

Я позаботился об этом, не используя Plazy.

path = '/data/'

import os
import pprint

def f(path):
    if os.path.isdir(path):
        d ,l = {}, []
        for name in os.listdir(path):
            if os.path.isdir(os.path.join(path, name)):
                d[name] = f(os.path.join(path, name))
            else:
                l.append(name)
                d = l
    return d

pprint.pprint(f(path))

Вывод

{ 
"data": 
    "subdir1" : { "subdir1_1": ["file1.txt"]},
    "subdir2" : { "subdir2_1": ["file1.txt", "file2.txt"]},
    "subdir3" : { "subdir3_1":
                     { "subdir3_2": ["file1.txt"]}
                 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...