2017-09-04 62 views
1

我有一個使用案例,我將把複雜的字典作爲不一致的規則輸入。 一個用例是象下面這樣:如何使用python動態地將不一致的字典轉換爲.ini?

pro : 1 
rel : 1.2 
del : demo 
cb :{ 
a : b 
} 
cd : { 
en : { 
    b : a 
} 
} 
cc : { 
a : b 
} 

我以前是這樣的: -

def jsonToDict(data): 
    d = data 
    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, (str,int, float)): 
       res[root] = {k:v} 
    dict2ini(d, '') 

    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) 

    with open('example.ini', 'w') as configfile: 
     config.write(configfile) 

,但上面並沒有處理所有出現在我的字典,但只在第一行的值每個部分。我經歷了[ConfigParser] [1]。但我無法找到解決方案,我的用例可以有人建議我一些解決方法,這也請注意上述數據不固定它會根據我們的需要而改變。

實例INI:

pro = 1 
rel = 1.2 
del = demo 

[cb] 
a=b 

[cd.en] 
b=a 
## suppose if multiple data is present in cd then 
[cd] 
b=a 
[cd.en] 
b=a 
## end 

[cc] 
a=b 
+0

您的代碼不完整;它訪問一個沒有在任何地方定義的詞典「res」。你能否也請修正你的代碼的縮進? 你想支持任意嵌套的字典嗎?你能舉一個例子說明生成的ini文件應該如何查看? –

+0

我修正了上面也給出了輸出ini應該看起來像但它不固定的看法,只要json內容嵌入到ini中,並且可以正確理解任何格式都可以。..是的,我確實想支持任意嵌套的字典@SvenMarnach –

+0

因此,如果有任何格式可以做,那麼'json = ''怎麼樣? –

回答

1

首先,需要在你的代碼的密切關注。在dict2ini你迭代的項目列表中d

for k, v in d.items(): 

如果v是標量值,你把它添加到res字典...但你總是使用相同的密鑰:

​​

因此,對於字典中的每個項目,您將覆蓋以前的值res[root]。有一些小的變化,我想你會得到更接近你想要什麼:

def dict2ini(d, root): 
    section = res[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: 
       section[_key] = {} 
     elif isinstance(v, (str,int, float)): 
      section[k] = v 
dict2ini(d, '') 

這給了我作爲輸出:

[DEFAULT] 
pro = 1 
del = demo 
rel = 1.2 

[] 

[cb] 
a = b 

[cc] 
a = b 

[cd] 

[cd.en] 
b = a 

你顯然有一些額外的東西來解決那裏,但希望能讓你朝着正確的方向前進。