保持ConfigParser输出文件的排序

7 投票
4 回答
7389 浏览
提问于 2025-04-15 12:56

我发现我的源代码管理中,用ConfigParser生成的输出文件内容顺序总是乱的。有时候,文件中的部分内容会换位置,甚至同一部分里的选项也会变动,尽管我并没有修改任何值。

有没有办法让配置文件里的内容保持有序,这样我每次启动应用程序时就不用提交那些微不足道的变化了?

4 个回答

2

不行。ConfigParser库输出的内容是按照字典的哈希顺序来的。(你可以查看源代码来确认这一点。)有一些替代这个模块的工具,做得更好。

我会看看能不能找到一个,并把它加到这里。

http://www.voidspace.org.uk/python/configobj.html#introduction就是我想到的那个。它不是直接可以替换的,但使用起来非常简单。

5

如果你想在Alexander Ljungberg的回答基础上更进一步,不仅对部分进行排序,还想对部分里的内容进行排序,你可以使用下面的代码:

config = ConfigParser.ConfigParser({}, collections.OrderedDict)
config.read('testfile.ini')
# Order the content of each section alphabetically
for section in config._sections:
    config._sections[section] = collections.OrderedDict(sorted(config._sections[section].items(), key=lambda t: t[0]))

# Order all sections alphabetically
config._sections = collections.OrderedDict(sorted(config._sections.items(), key=lambda t: t[0] ))

# Write ini file to standard output
config.write(sys.stdout)

这段代码使用了OrderedDict字典(这样可以保持顺序),并通过覆盖ConfigParser内部的_sections字典来对读取的ini文件进行排序。

9

看起来这个问题在 Python 3.1 和 2.7 中得到了修复,新增了有序字典的功能:

现在标准库支持在多个模块中使用有序字典。configparser 模块默认使用有序字典。这意味着配置文件可以按照原来的顺序读取、修改,然后再写回去。

撰写回答