保持ConfigParser输出文件的排序
我发现我的源代码管理中,用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 模块默认使用有序字典。这意味着配置文件可以按照原来的顺序读取、修改,然后再写回去。