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

6 投票
1 回答
7655 浏览
提问于 2025-04-28 15:07

我想先说,我在Stack Overflow上找这个问题的答案已经很久了,但一直没找到什么有用的信息。我也查了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() 这一行放到函数里面。

撰写回答