【问题标题】:Keep ConfigParser output files sorted保持 ConfigParser 输出文件排序
【发布时间】:2010-11-11 04:02:50
【问题描述】:

我注意到我的源代码管理中使用 ConfigParser 生成的输出文件的内容的顺序永远不会相同。有时,即使没有对值进行任何修改,部分也会更改部分内的位置或选项。

有没有办法在配置文件中保持排序,这样我每次启动应用程序时都不必提交微不足道的更改?

【问题讨论】:

  • This answer 对一个类似的问题给出了一些关于如何在 Python 2 中完成排序输出的建议。

标签: python configuration configparser


【解决方案1】:

看起来这是在 Python 3.1 和 2.7 中修复的,并引入了有序字典:

标准库现在支持使用 在几个有序字典 模块。 configparser 模块使用 默认情况下。这让 读取、修改配置文件, 然后写回他们的 原始订单。

【讨论】:

  • 在 Python 2.7 中,您可以 from collections import OrderedDict 和使用 ConfigParser(dict_type=OrderedDict) 使解析器使用有序字典。基于最少的测试,我认为这应该对您有好处。
  • 在 Python 2.7 中,您不需要这样做 eksortso,它是默认设置。
【解决方案2】:

如果您想比 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)

这使用 OrderdDict 字典(以保持排序)并通过覆盖内部 _sections 字典对从外部 ConfigParser 读取的 ini 文件进行排序。

【讨论】:

    【解决方案3】:

    没有。 ConfigParser 库以字典哈希顺序写出内容。 (如果您查看源代码,您可以看到这一点。)这个模块的替代品做得更好。

    我会看看能不能找到并添加到这里。

    http://www.voidspace.org.uk/python/configobj.html#introduction 是我想的那个。它不是直接替代品,但非常易于使用。

    【讨论】:

      【解决方案4】:

      ConfigParser 基于 ini 文件格式,在其设计中应该对顺序不敏感。如果您的配置文件格式对顺序敏感,则不能使用 ConfigParser。如果您的 ini 类型格式对语句的顺序很敏感,也可能会让人感到困惑......

      【讨论】:

      • 如果您正在对结果进行版本控制并希望看到不同版本之间看起来合理的差异,那么让项目以相同的顺序出现仍然很有帮助。
      • 啊,对。我完全错过了您正在创建文件。我的错。毕竟是 configPARSER。 ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多