gpt4 book ai didi

python - 如何使用python动态地将不一致的字典转换为.ini?

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:55 24 4
gpt4 key购买 nike

我有一个用例,我将在不一致的层次结构中获取复杂的字典作为输入。一个用例如下所示:

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

最佳答案

首先,仔细查看您的代码。在 dict2ini 中,您迭代 d 中的项目列表:

    for k, v in d.items():

如果 v 是标量值,则将其添加到 res 字典中...但始终使用相同的键:

        elif isinstance(v, (str, int, float)):
res[root] = {k: v}

因此,对于字典中的每个项目,您将覆盖 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

显然,您还有一些其他问题需要解决,但希望这能让您朝着正确的方向前进。

关于python - 如何使用python动态地将不一致的字典转换为.ini?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46034315/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com