Python 到ini的多级字典
如何将多级(*)字典转换为ini 示例:Python 到ini的多级字典,python,ini,configparser,Python,Ini,Configparser,如何将多级(*)字典转换为ini 示例: >>> foo = {} >>> foo['bar'] = {} >>> foo['bar']['bar1'] = 1 >>> foo['bar']['bar2'] = {} >>> foo['bar']['bar2']['bar3'] = 2 >>> foo['goo'] = {} >>> print foo {'goo':
>>> foo = {}
>>> foo['bar'] = {}
>>> foo['bar']['bar1'] = 1
>>> foo['bar']['bar2'] = {}
>>> foo['bar']['bar2']['bar3'] = 2
>>> foo['goo'] = {}
>>> print foo
{'goo': {}, 'bar': {'bar1': 1, 'bar2': {'bar3': 2}}}
如何将foo转换为ini文件格式?
[bar]
bar1 = 1
[bar.bar2]
bar3 = 2
[goo]
(*)多级字典(递归定义)是一种字典,其中值可以是多级字典或基元类型(字符串或int)
ConfigParser
似乎无法执行此操作。您必须仔细检查dict并重新构造它:
import ConfigParser
from collections import defaultdict
d = {'goo': {}, 'bar': {'bar1': 1, 'bar2': {'bar3': 2}}}
res = defaultdict(dict)
def dict2ini(d, root):
for k, v in d.items():
if isinstance(v, dict):
_key = '%s.%s' % (root, k) if root else k
if v:
dict2ini(v, _key)
else:
res[_key] = {}
elif isinstance(v, (basestring, int, float)):
res[root] = {k:v}
dict2ini(d, '')
res,看起来像是创建节和键所需的结构:
{'bar.bar2':{'bar3':2},'goo':{},'bar':{'bar1':1})
然后,您可以轻松编写ini配置:
config = ConfigParser.RawConfigParser()
for key in sorted(res.keys()):
config.add_section(key)
for subKey, value in res[key].items():
config.set(key, subKey, value)