2017-01-30 70 views
0

如何將多級(*)字典轉換爲ini?多級字典到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似乎是不能夠做的這個。

回答

0

你必須走在字典和重新架構它:

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

資源,看起來你需要的結構,打造節和鍵:

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