使用Python ConfigParser处理多个配置文件
当你调用 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的文件名顺序来读取这些文件,后面的文件会把前面的内容给覆盖掉。