在Python中的嵌套字典中存储目录结构

l0o*_*0o0 2 python recursion dictionary

我正在尝试将目录结构存储在嵌套字典中。\n目录树

\n\n
\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dirA\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 dirB1\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file1.txt\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 dirB2\n\xe2\x94\x82\xc2\xa0\xc2\xa0     \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 file2.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 templates\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 base.html\n\xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 report.html\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test.py  \n
Run Code Online (Sandbox Code Playgroud)\n\n

嵌套字典如下:

\n\n
{'dirs': {'.': {'dirs': {'dirA': {'dirs': {'dirB1': {'dirs': {},\n                                                     'files': ['file1.txt']}, \n                                           'dirB2': {'dirs': {},\n                                                     'files':['file2.txt']}\n                                                     }                                          \n                                  'files': []}, \n                         'templates':{'dirs':{},\n                                  'files':['base.html', 'report.html']}},\n         'files': ['test.py']}},\n 'files': []}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我认为递归是实现此目的的好方法。

\n\n
import os                                                 \nimport pprint              \n\npp = pprint.PrettyPrinter()\ndef path_to_dict(path): \n    d = {'dirs':{},'files':[]}\n    name = os.path.basename(path)\n    if os.path.isdir(path):\n        if name not in d['dirs']:\n            d['dirs'][name] = {'dirs':{},'files':[]}\n        for x in os.listdir(path):\n            d['dirs'][name]= path_to_dict(os.path.join(path,x))                                                 \n    else:                  \n        d['files'].append(name)        \n    return d               \n\nmydict = path_to_dict('.')\npp.pprint(mydict)\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果和我预想的不一样。但我不知道递归中哪一步出了问题。

\n

y.l*_*uis 5

您在每次调用时创建dict对象,您需要做的是d['dirs'][name]在每次调用时传递它的值以允许其递归构造:

import os
import pprint

pp = pprint.PrettyPrinter()

def path_to_dict(path, d):

    name = os.path.basename(path)

    if os.path.isdir(path):
        if name not in d['dirs']:
            d['dirs'][name] = {'dirs':{},'files':[]}
        for x in os.listdir(path):
            path_to_dict(os.path.join(path,x), d['dirs'][name])
    else:
        d['files'].append(name)
    return d


mydict = path_to_dict('.', d = {'dirs':{},'files':[]})

pp.pprint(mydict)
Run Code Online (Sandbox Code Playgroud)