例如,我在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}}}
然后我想把它转换成这样的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
虽然data1_
或data2_
需要代表嵌套看起来有点奇怪,但现在看起来还不错。
但是我需要将此conf文件发送给另一个用户,他需要从此conf文件恢复原始字典。似乎用户必须再写几个代码来恢复dict。但是,这个解决方案看起来很脏。
我想知道是否有一种Pythonic方式让我将dict保存到conf文件中(如果conf文件不合适,其他可读格式的纯文本也可以接受)然后从该纯文本文件恢复dict。
答案 0 :(得分:6)
查看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)
再读一遍:
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])
答案 1 :(得分:5)
将它保存为JSON:
import json
with open('configfilename', 'w') as configfile:
json.dump(yourdict, configfile, indent=2)
我设置json.dump()
缩进以使文件合理可读。
加载:
import json
with open('configfilename', 'r') as configfile:
yourdict = json.load(configfile)
将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
}
}
}
答案 2 :(得分:0)
只需将其写为JSON并从中恢复即可。它仍然是非常易读的,它将轻松支持超出“INI”语法的基本数据结构。
答案 3 :(得分:0)
如果是.ini文件,则可以使用configobj模块。 阅读:
from configobj import ConfigObj
dict = ConfigObj(path)
要保存:
from configobj import ConfigObj
config = ConfigObj(dict)
config.filename = "config.ini"
config.write()
答案 4 :(得分:0)
无需循环或第 3 方模块即可做到这一点。
无论字典有多深,这都会起作用。
from configparser import ConfigParser
data = {"a_summary" : {"data1":{"length":100, "quality":10},
"data2":{"length":90, "quality":{"q1":1, "q2":{"am": "high", "pm": "low"}}}},
"b_summary" : {"data1":{"comments":19, "views":100},
"data2":{"comments":9, "views":4}}}
# dict -> ConfigParser
config = ConfigParser()
config.read_dict(data)
with open('example.ini', 'w') as configfile:
config.write(configfile)
# check result
with open('example.ini', 'r') as configfile2:
print(configfile2.read())
# ConfigParser -> dict
config2 = ConfigParser()
config2.read('example.ini')
data2 = {section: dict(config2[section]) for section in config2.sections()}
print(data2)