30

为 Python 程序创建设置文件,内置模块(ConfigParser)或独立项目(ConfigObj),或使用 YAML 数据序列化格式,哪个更好?我听说 ConfigObj 比 ConfigParser 更容易使用,尽管它不是内置库。我还读到 PyYAML 很容易使用,尽管 YAML 需要一些时间来使用。除了易于实施之外,哪个是创建设置/配置文件的最佳选择?

4

3 回答 3

13

这取决于您要存储在配置文件中的内容以及如何使用它们

  • 如果您进行往返(yaml→code→yaml)并希望保留注释,则不能使用PyYAMLor ConfigParser

  • 如果您想保留密钥的顺序(例如,当您签入配置文件时), 除非您指定(这使得更新比普通映射更容易),PyYAML否则不要这样做!!omap

  • 如果您想要具有包含映射/字典的未命名元素列表的复杂结构,那么ConfigParser并且ConfigObj不会帮助您,因为 INI 文件键值对必须进入部分并且列表只能是值。

YAML 阅读器的ruamel.yaml实现支持上述所有¹。很长一段时间以来,我一直使用fuzzyman 出色的ConfigObj 来保存往返评论,以及使用PyYAML 来处理更复杂的结构,这结合了两全其美。ruamel.yaml包括可以将INI 文件转换为 YAML的yaml实用程序ConfigObj


¹ ruamel.yaml 是一个支持 YAML 1.2 的 YAML 库(我建议使用它,但我是该包的作者)。PyYAML 仅支持(大部分)YAML 1.1。

于 2014-11-24T12:00:09.977 回答
12

使用 ConfigObj 至少非常简单,而且 ini 文件通常比 YAML 更简单(并且使用更广泛)。对于更复杂的情况,包括验证、默认值和类型,ConfigObj 提供了一种通过 configspec 验证来执行此操作的方法。

使用 ConfigObj 读取 ini 文件的简单代码:

from configobj import ConfigObj

conf = ConfigObj('filename.ini')
section = conf['section']
value = section['value']

它会自动为您处理列表值并允许多行值。如果您修改配置文件,您可以将其写回,同时保留顺序和注释。

有关更多信息,请参阅这些文章,包括类型验证的示例:

于 2010-08-12T00:19:56.277 回答
5

ConfigParser 有一个非常糟糕的 API,ConfigObj 应该很好但我从未使用过它,对于 ini 文件我通常实现自己的解析器。

然而,类似ini的格式无论如何都不能很好地处理不同的类型、序列或递归映射,所以我只会使用yaml。使用编辑器很容易阅读和编辑,有一个解析这些文件的标准,你没有提到的类似 ini 格式的缺点。

于 2010-08-09T22:28:15.820 回答