在读取多个配置文件时,ConfigParser会覆盖以前的文件,为什么?

ord*_*anj 5 python configparser

所以我想首先说我一直在寻找SO的答案,并且找不到任何有用的东西.我也查看了Python的文档,但未能找到有用的东西.我的上一个问题有点懒,收到负面反馈,所以我尽我所能在这里提出一个简单明了的问题.一如既往,提前感谢您的帮助!

那么,有人可以解释我在Python的ConfigParser中遇到的奇怪行为.我有两个不同的配置文件,每个都有一个Section 1.这两个文件具有不同数量的选项,但覆盖的选项数量较少.这是代码和输出:

第一个配置文件:test1.ini

[Section 1]
Option 1 : One
Option 2 : Two
Option 3 : None
Option 4 : Four
Run Code Online (Sandbox Code Playgroud)

第二个配置文件:test2.ini

[Section 1]
Option 1 : One
Option 2 : None
Option 3 : Three
Run Code Online (Sandbox Code Playgroud)

读取配置文件的驱动程序

from ConfigParser import SafeConfigParser

parser = SafeConfigParser()

def ParseThis(file, section):
    parser.read(file)

    for option in parser.options(section):
        print "\t" + option
        try:
            if parser.get(section, option) != 'None':
                print option + ": " + parser.get(section, option)
            else:
                print option + ": Option doesn't exist"
        except:
            print option + ": Something went wrong"

print "First File:"
print "Section 1"
ParseThis('test2.ini', 'Section 1')


print "\n"
print "Second File: "
print "Section 1"
ParseThis('test1.ini', 'Section 1')

print "\n"
print "First File: "
print "Section 1"
ParseThis('test2.ini', 'Section 1')
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出,这没有任何意义.

First File:
Section 1
    option 1
option 1: One
    option 2
option 2: Option doesn't exist
    option 3
option 3: Three


Second File: 
Section 1
    option 1
option 1: One
    option 2
option 2: Two
    option 3
option 3: Option doesn't exist
    option 4
option 4: Four


First File: 
Section 1
    option 1
option 1: One
    option 2
option 2: Option doesn't exist
    option 3
option 3: Three
    option 4   <== why this line?
option 4: Four <== why this line?
Run Code Online (Sandbox Code Playgroud)

Bre*_*arn 10

单个ConfigParser实例用于表示单个配置,该配置可以以"优先顺序"从多个文件派生,以便后面的文件覆盖之前的文件.文档没有说明这一点,但确实说:

其设计使您可以指定潜在配置文件位置的列表(例如,当前目录,用户的主目录和某些系统范围的目录),并且将读取列表中的所有现有配置文件.

如果希望将读取的配置保持独立,则需要SafeConfigParser为每个配置创建单独的实例.parser = SafeConfigParser()在功能内移动你的线.

  • “文件并没有完全清楚地说明这一点”同意 (2认同)