将dict转换为配置文件,然后从config恢复dict

Han*_*Sun 2 python configuration text dictionary

例如,我在Python中有一个字典,如下所示:

{"a_summary" : 
   {"data1":{"length":100, "quality":10}, 
    "data2":{"length":90, "quality":9}},
"b_summary" :  
   {"data1":{"comments":19, "views":100}, 
    "data2":{"comments":9, "views":4}}}
Run Code Online (Sandbox Code Playgroud)

然后我想把它转换成这样的conf文件:

[a_summary]
data1_length=100
data1_quality=10
data2_length=90
data2_quality=9

[b_summary]
data1_comments=19
data1_views=100
data2_comments=9
data2_views=4
Run Code Online (Sandbox Code Playgroud)

虽然它看起来有点奇怪data1_data2_需要代表嵌套,但现在似乎还可以.

但后来我需要将此conf文件发送给另一个用户,他需要从此conf文件中恢复原始字典.似乎用户必须再写几个代码来恢复dict.但是,这个解决方案看起来很脏.

我想知道是否有一种Pythonic方式让我将dict保存到conf文件中(如果conf文件不合适,其他可读格式的纯文本也可以接受),然后从该纯文本文件恢复dict.

Cha*_*net 7

看看configparser模块.它可以帮助你做你想要的.

import configparser

data = {"a_summary" : {"data1":{"length":100, "quality":10}, 
            "data2":{"length":90, "quality":9}},
        "b_summary" :  {"data1":{"comments":19, "views":100}, 
            "data2":{"comments":9, "views":4}}}
config = configparser.ConfigParser()
for key1, data1 in data.items():
    config[key1] = {}
    for key2, data2 in data1.items():
        for key3, data3 in data2.items():
            config[key1]["{}_{}".format(key2, key3)] = str(data3)
with open('example.ini', 'w') as configfile:
    config.write(configfile)
Run Code Online (Sandbox Code Playgroud)

并再次阅读:

config2 = configparser.ConfigParser()
config2.read('example.ini')
data = {}
for key in config2.sections():
    data[key] = {}
    for key2 in config2[key]:
        k1, k2 = key2.split('_')
        if k1 not in data[key]:
            data[key][k1] = {}
        data[key][k1][k2] = int(config2[key][key2])
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

也许保存为JSON:

import json

with open('configfilename', 'w') as configfile:
    json.dump(yourdict, configfile, indent=2)
Run Code Online (Sandbox Code Playgroud)

我设置json.dump()缩进以使文件合理可读.

加载:

import json

with open('configfilename', 'r') as configfile:
    yourdict = json.load(configfile)
Run Code Online (Sandbox Code Playgroud)

随着indent集来2,你的结构将写出为:

{
  "a_summary": {
    "data1": {
      "length": 100, 
      "quality": 10
    }, 
    "data2": {
      "length": 90, 
      "quality": 9
    }
  }, 
  "b_summary": {
    "data1": {
      "comments": 19, 
      "views": 100
    }, 
    "data2": {
      "comments": 9, 
      "views": 4
    }
  }
}
Run Code Online (Sandbox Code Playgroud)