比较configparser文件

时间:2015-12-09 13:45:00

标签: python dictionary compare configparser

我刚开始使用ConfigParser并且它看起来很有趣,但我有一个我有的想法。我试图将配置文件中的所有部分与第一部分进行比较。

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个键。

谢谢大家的时间和精力来帮助我。

1 个答案:

答案 0 :(得分:0)

我使用特殊的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"

请注意key3的未定义Section2采用默认值,因此不会报告为不同。但key2,明确分配了不同的值。

config.sections()为您提供除了默认值之外的所有部分,因此不必对默认密钥与它们自身进行比较。