¿Cómo analizar una estructura de directorios en el diccionario?

Tengo una lista de la estructura de directorios como:

['/a/b', '/a/b/c', '/a/b/c/d', '/a/b/c/e', '/a/b/c/f/g', '/a/b/c/f/h', '/a/b/c/f/i'] 

Quiero convertirlo en dict como una estructura de árbol.

 {'/': {'a': {'b': {'c': [{'d':None}, {'e':None}, {'f':[{'g':None, {'h':None}, {'i':None}]} ] } } } } 

Me quedé atascado donde empezar? ¿Qué estructura de datos será adecuada?

Gracias.

básicamente

 lst = ['/a/b', '/a/b/c', '/a/b/c/d', '/a/b/c/e', '/a/b/c/f/g', '/a/b/c/f/h', '/a/b/c/f/i'] dct = {} for item in lst: p = dct for x in item.split('/'): p = p.setdefault(x, {}) print dct 

produce

  {'': {'a': {'b': {'c': {'e': {}, 'd': {}, 'f': {'i': {}, 'h': {}, 'g': {}}}}}}} 

Esta no es exactamente tu estructura, pero debería darte una idea básica.

Como dijo Sven Marnach , la estructura de datos de salida debería ser más consistente, por ejemplo, solo diccionarios nesteds donde las carpetas están asociadas a dict y los archivos a ninguno.

Aquí hay un script que usa os.walk . No toma una lista como entrada, pero debería hacer lo que desea al final si desea analizar los archivos.

 import os from pprint import pprint def set_leaf(tree, branches, leaf): """ Set a terminal element to *leaf* within nested dictionaries. *branches* defines the path through dictionnaries. Example: >>> t = {} >>> set_leaf(t, ['b1','b2','b3'], 'new_leaf') >>> print t {'b1': {'b2': {'b3': 'new_leaf'}}} """ if len(branches) == 1: tree[branches[0]] = leaf return if not tree.has_key(branches[0]): tree[branches[0]] = {} set_leaf(tree[branches[0]], branches[1:], leaf) startpath = '.' tree = {} for root, dirs, files in os.walk(startpath): branches = [startpath] if root != startpath: branches.extend(os.path.relpath(root, startpath).split('/')) set_leaf(tree, branches, dict([(d,{}) for d in dirs]+ \ [(f,None) for f in files])) print 'tree:' pprint(tree) 

Comience mirando os.listdir o os.walk . Te permitirán recorrer directorios recursivamente. Ya sea automáticamente (os.walk) o semiautomáticamente (con os.listdir). Entonces podrías guardar lo que encuentres en un diccionario.