Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python动态地将不一致的字典转换为.ini?_Python_Dictionary_Configparser - Fatal编程技术网

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

如何使用python动态地将不一致的字典转换为.ini?,python,dictionary,configparser,Python,Dictionary,Configparser,我有一个用例,在这个用例中,我将在一个不一致的Hirarch中获取复杂的字典作为输入。 一个用例如下所示: 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):

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

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)
但上面并没有处理dict中的所有值,而是只处理每个部分的第一行。我通过了[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

显然,您还有一些额外的问题需要解决,但希望这能为您指明正确的方向。

您的代码不完整;它访问未在任何地方定义的字典
res
。你能不能也修改一下你代码的缩进?是否要支持任意嵌套的词典?你能举个例子说明结果ini文件应该是什么样子吗?我修复了上面的问题,也给出了输出ini应该是什么样子,但不是固定的视图,只要json内容嵌入到ini中并且可以正确理解,任何格式都可以。。同样是的,我确实希望支持任意嵌套的字典@SvenMarnachSo如果任何格式都可以,那么
json=
?@SvenMarnach的任何格式我指的是模式,但输出必须是.ini/properties格式。有一个名为
json
的键,该键的值是一个json字符串。