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

6
我想先说一下,我已经在stackoverflow上寻找了答案,但没有找到有用的信息。我还查阅了Python的文档,但也没有找到有用的信息。我的上一个问题比较懒惰,得到了负面反馈,所以我正在尽力在这里提出简单明了的问题。感谢您提前的任何帮助!
那么,有人能解释一下我使用Python的ConfigParser时遇到的奇怪行为吗?我有两个不同的配置文件,每个文件都有一个“Section 1”。这两个文件有不同数量的选项,但是选项较少的那个会被覆盖。以下是代码和输出:
第一个配置文件:test1.ini
[Section 1]
Option 1 : One
Option 2 : Two
Option 3 : None
Option 4 : Four

第二个配置文件:test2.ini

[Section 1]
Option 1 : One
Option 2 : None
Option 3 : Three

读取配置文件的驱动程序

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')

这是我得到的输出,它毫无意义。
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?
1个回答

12
一个 ConfigParser 实例用于表示一个配置,它可能派生自多个文件,并以“优先顺序”的方式进行,以使后来的文件覆盖早期的文件。文档没有完全表明这一点,但确实说过:
“这是为了让您可以指定潜在的配置文件位置列表(例如当前目录、用户的主目录和某些系统范围的目录),并且将读取列表中所有现有的配置文件。”
如果你想要读取的配置被分开保留,你需要为每个配置创建一个单独的 SafeConfigParser 实例。将你的 `parser = SafeConfigParser()`代码放在函数内部。

2
文档并没有完全说明清楚。同意。 - dtmland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接