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

时间:2017-09-25 08:21:59

标签: python dictionary recursion

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

├── dirA
│   ├── dirB1
│   │   └── file1.txt
│   └── dirB2
│       └── file2.txt
├── templates
│   ├── base.html
│   └── report.html
└── test.py  

嵌套字典如下:

{'dirs': {'.': {'dirs': {'dirA': {'dirs': {'dirB1': {'dirs': {},
                                                     'files': ['file1.txt']}, 
                                           'dirB2': {'dirs': {},
                                                     'files':['file2.txt']}
                                                     }                                          
                                  'files': []}, 
                         'templates':{'dirs':{},
                                  'files':['base.html', 'report.html']}},
         'files': ['test.py']}},
 'files': []}

我认为递归是一种很好的方法。

import os                                                 
import pprint              

pp = pprint.PrettyPrinter()
def path_to_dict(path): 
    d = {'dirs':{},'files':[]}
    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):
            d['dirs'][name]= path_to_dict(os.path.join(path,x))                                                 
    else:                  
        d['files'].append(name)        
    return d               

mydict = path_to_dict('.')
pp.pprint(mydict)

结果与我的预期不同。但我不知道递归中哪一步出错了。

1 个答案:

答案 0 :(得分:1)

您正在为每次调用创建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)