Python 到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':

如何将多级(*)字典转换为ini

示例:

>>> 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)