【问题标题】:Compare subsection of configparser file比较 configparser 文件的小节
【发布时间】:2015-12-09 13:45:00
【问题描述】:

我刚开始与ConfigParser 合作,它看起来很有趣,但我对自己的一个想法很感兴趣。我正在尝试将 configurationFile.ini 中的所有部分与第一部分进行比较。

configurationFile.ini 演示示例:

[DefaultSection]
key1    : value1
key2    : value2
key3    : value3
.
.
.
keyn    : valuen

[Section2]
key1    : value5
key2    : value6
key3    : value7
.
.
.
keyn    : valuen

[Section3]
key1    : value8
key2    : value9
key3    : value10
.
.
.
keyn    : valuen

我要做的是将每个部分与默认部分进行比较,看看子部分是否有任何差异。我想看看所有其余部分的键是否与默认键匹配,我不在乎的值。如果密钥不匹配,则应打印丢失的密钥:

例如:section(n) is missing key(5)

我正在使用双字典,我认为这是最合适的查找差异的方法,但我的技能有限,我找不到解决方案。

加载和解析数据的代码示例:

#!/usr/bin/python
import pprint
import ConfigParser

if __name__ == '__main__':
    configObj = ConfigParser.ConfigParser()
    configObj.read('configurationFile.ini')
    listOfSections = configObj.sections()

    doubleDictionary = {}
    for section in listOfSections:
        doubleDictionary[section] = configObj.items(section)

    pprint.pprint(doubleDictionary)

    """{'dictionary_1': [('key_1', 'value_1'),
                         ('key_2', 'value_2'),
                         ('key_3', 'value_3')],
        'dictionary_2': [('key_1', 'value_4'),
                         ('key_2', 'value_5')],
        'dictionary_3': [('key_1', 'value_6'),
                         ('key_2', 'value_7')]}"""

我想将 dictionary_1 的所有键与 configurationFile.ini 中的所有字典进行比较。脚本当然应该是通用的,能够处理 n 个字典和 n 个键。

感谢大家花费时间和精力来帮助我。

【问题讨论】:

    标签: python dictionary compare configparser


    【解决方案1】:

    如果您使用特殊的 DEFAULT 部分,那么 configparser 将在您读取文件时为部分中的每个缺失键提供默认值。这可能不是您想要的,但是如果您像

    这样创建文件
    config = ConfigParser.ConfigParser()
    
    config.set('DEFAULT', 'key1', "value1")
    config.set('DEFAULT', 'key2', "value2")
    config.set('DEFAULT', 'key3', "value3")
    
    config.add_section('Section2')
    config.set('Section2', 'key1', "value5")
    config.set('Section2', 'key2', "value2")
    
    with open("configurationFile.ini", 'w') as f:
        config.write(f)
    

    那么你可以像这样得到不同的键

    config = ConfigParser.ConfigParser()
    config.read("configurationFile.ini")
    
    for section in config.sections():
        for key in config.options(section):
            if config.get(section, key) != config.get('DEFAULT', key):
                print key + " of " + section + " differs from default"
    

    注意Section2的未定义key3取默认值,所以不会报不同。但是key2,它被显式分配了一个不同的值。

    config.sections() 为您提供每个部分除了默认部分,因此无需将默认键与其自身进行比较。

    【讨论】:

    • 您好,感谢您花时间和精力阅读和回复我的问题。我遇到这个问题已经有一段时间了,老实说,我还没有花时间解决它。我希望在周末我可以花一些时间在这个问题上回复你。再次感谢您的时间和精力。
    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 1970-01-01
    • 2011-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多