¿Generando un diccionario de árbol de archivos a partir de la lista de archivos en Python?

-1

Tratando de encontrar la forma más sencilla de hacer esto. Tengo una lista de todos los archivos en un servidor. Quiero reescribir esta lista como un diccionario que represente mejor el árbol de archivos.

Lo que tengo:

"study/patient/visitNumber/C1/", "study/patient/visitNumber/C1/subject_14Jan16_V17_C1a.mp4", "study/patient/visitNumber/C1/subject_14Jan16_V17_C1b.mp4", "study/patient/visitNumber/C2/", "study/patient/visitNumber/C2/subject_14Jan16_V17_C2a.mp4", "study/patient/visitNumber/C2/study_subject_V17_C2.mp4", "study/patient/visitNumber/master/C1/subject_14Jan16_V17_C1a.MTS",

Lo que quiero

   {"parentFolder":{
          "childFolder":{
             "file":"filename",
             "grandChildFolder":{"etc...":""}
           }
           "childFolder2":{
             "file":"filename2",
             "grandChildFolder2":{"etc...":""}
           }
    }}

Hay más de 6000 elementos en la lista y la estructura de la carpeta es realmente inconsistente, por lo que tengo problemas para dividir los nombres de archivo por carpeta y saber cómo agregarlos al diccionario. ¿Sospecho de recursividad? Gracias.

2
  • ¿Podría ser más específico? "Quiero reescribir esta lista como un diccionario que represente mejor el árbol de archivos" 13 oct a las 18:14
  • @ pySam1459 Seguro. reescribiendo mi pregunta 13 de oct a las 18:19
0

Este código recorre la lista de archivos y crea / modifica el árbol según la ruta. Cada directorio 'nodo' tiene pares clave-valor de cada subdirectorio y 1 par clave-valor 'archivos', que es una lista de todos los archivos en ese directorio. Tenga en cuenta que este código solo funciona si todos los archivos de la lista comienzan en el mismo directorio raíz.

// files = [...]

tree = {"files": []}

for file in files:
    dirs = file.strip(r"/").split(r"/")
    c = tree
    for i, d in enumerate(dirs):
        if "." in d:
            c["files"].append(d)
        else:
            if d not in c:
                c[d] = {"files": []}

            c = c[d]
1
  • ¡Muchas gracias! Esto funcionó. 14 de oct a las 13:57