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

标签 python dictionary configparser

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

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/

相关文章:

python - 用 Python 制造噪音

python - Django:如何在根据发布请求将数据保存到数据库之前检查数据是否正确?

python - 确保 py.test 在 sys.path 中包含应用程序目录

list - Dart 如何克隆 map 列表

Python - 当我尝试循环更新()时,我的字典仅res

python - 使用 Python 读取 fortigate 配置文件

Python 2.7 在程序中运行外部 .py 文件

c# - 在 C# WebForm 上反序列化动态 JSON 数组

python - 使用全局选项解析 rsyncd 配置文件时出现 ConfigParser.MissingSectionHeaderError

python - 我可以使用 Python configparser 删除 config.ini 文件的一部分中的特定值吗?