【问题标题】:Multilevel dictionary to ini多级字典到ini
【发布时间】:2017-01-30 15:22:08
【问题描述】:

如何将多级(*)字典转换为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 似乎无法做到这一点。

【问题讨论】:

    标签: python ini configparser


    【解决方案1】:

    你必须遍历字典并重新构建它:

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      相关资源
      最近更新 更多