2 votes

Analyse syntaxique d'une liste de répertoires dans un dictionnaire imbriqué

J'ai les éléments suivants dans une liste avec le format de la structure des répertoires.

[
    'fold/2021/',
    'fold/2021/11/',
    'fold/2021/11/01/',
    'fold/2021/11/01/123.gz',
    'fold/2021/11/01/345.gz',
    'fold/2021/12/',
    'fold/2021/12/02/',
    'fold/2022/'
]

J'en ai besoin dans la structure suivante de dictionnaires imbriqués :

{
  "fold": {
    "2021": {
      "11": {
        "01": {
          "123.gz": None,
          "345.gz": None
        }
      },
      "12": {
        "02": {}
      }
    },
    "2022": {}
  }
}

J'ai beaucoup essayé avec la récursion et d'autres méthodes, mais je n'arrive pas à obtenir cette structure.

Voici ce que j'ai essayé :

def get_directory_structure(path):
    global main_dict

    local_dict = {}

    a = path.rstrip('/').split('/')
    local_dict.setdefault(a[0], {})

    if len(a) > 1:
        return_dict = get_directory_structure(path[path.find('/')+1:])

        local_dict[a[0]] = return_dict

        if a[0] == 'fold':
            main_dict.update(**local_dict)

    return local_dict

main_dict = {}
for path in paths:
    get_directory_structure(main_dict, path)

print(main_dict)

Veuillez m'aider. Je vous remercie.

Note : - Je n'ai pas le dossier sur mon PC. Je n'ai que les éléments de la liste

3voto

tobias_k Points 13121

Vous pouvez essayer comme ceci, sans utiliser la récursion mais en utilisant * -unpacking pour séparer les éléments dans le fichier (ou '' ) et le chemin qui y mène, et en utilisant setdefault faire "gonfler" les niveaux plus profonds du dict, s'ils n'existent pas encore, et enfin ajouter le fichier, le cas échéant.

res = {}
for item in lst:
    d = res
    *path, last = item.split("/")
    for p in path:
        d = d.setdefault(p, {})
    if last != "":
        d[last] = None

Après, res devrait être le résultat souhaité :

{'fold': {'2021': {'11': {'01': {'123.gz': None, '345.gz': None}}, '12': {'02': {}}}, '2022': {}}}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X