我正在尝试将目录结构存储在嵌套字典中。 目录树
├── 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)
结果与我的预期不同。但我不知道递归中哪一步出错了。
答案 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)