2017-01-30 16 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 в ини формат файла?

[bar] 
bar1 = 1 
[bar.bar2] 
bar3 = 2 
[goo] 

(*) Многоуровневый словарь (рекурсивное определение) представляет собой словарь, где значения могут быть многоуровневый словарь или примитивный тип (строка или INT)

ConfigParser, кажется, не способен делать это.

ответ

0

Вы должны ходить по 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, '') 

разрешением, выглядит как структура вам нужно, чтобы создать разделы и ключ:

{'bar.bar2': {'bar3': 2}, 'goo': {}, 'bar': {'bar1': 1}})

Тогда вам может легко написать ini config:

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)