使用Python ConfigParser处理多个配置文件

49 投票
2 回答
26838 浏览
提问于 2025-04-16 06:09

当你调用 ConfigParser.read 的时候,可以传入一个字符串列表,这些字符串代表可能的配置文件位置。这个函数会返回那些成功读取的文件列表。

那么,当加载多个配置文件时,如果这些文件中有重复的部分或者键,默认的行为是什么呢?后面的文件会覆盖前面文件中解析的值吗?是整个部分都被覆盖,还是只覆盖那些冲突的键呢?

2 个回答

35

这里给个例子,方便理解。

我可以创建以下两个文件:

config1.ini
# ** config1.ini **
[shared]
prop_uniue1 = 1
prop_shared = 10

[unique1]
test_unique = 101

还有 config2.ini

# ** config2.ini **
[shared]
prop_uniue2 = 2
prop_shared = 14

[unique2]
test_unique = 102

然后如果我运行以下代码,就能看到这些配置是怎么更新的(输出结果在各自的打印语句后面以注释的形式显示):

import ConfigParser

config = ConfigParser.ConfigParser()
config.read(['config1.ini', 'config2.ini'])


print config.sections() # ['shared', 'unique1', 'unique2']
print config.get("shared", "prop_uniue1")  # 1
print config.get("shared", "prop_shared")  # 14
print config.get("unique1", "test_unique") # 101

print config.get("shared", "prop_uniue2")  # 2
print config.get("unique2", "test_unique") # 102

总结一下,可以看出:

  • 正如 crasic 所说,文件的读取顺序是根据传给读取方法的文件名列表的顺序来决定的,
  • 后面的文件会覆盖前面的文件中的键值,但这个覆盖是在较低的选项级别进行的,而不是在较高的部分级别。这意味着,如果某些选项在后面的文件中没有出现,即使该部分在后面的文件中存在,前面文件中的选项仍然会被使用。
48

经过测试发现,ConfigParser会在读取每个文件时覆盖之前的键,也就是说,如果你有多个文件,它会按照你传给ConfigParser.read的文件名顺序来读取这些文件,后面的文件会把前面的内容给覆盖掉。

撰写回答