ConfigObj/ConfigParser 与 YAML 在 Python 配置文件中的对比

31 投票
3 回答
19348 浏览
提问于 2025-04-16 02:33

在为Python程序创建设置文件时,使用内置模块(ConfigParser)、独立项目(ConfigObj)还是YAML数据序列化格式,哪个更好呢?我听说ConfigObj比ConfigParser更容易使用,尽管它不是内置库。我也读到过PyYAML很简单,不过YAML的使用可能需要花点时间。除了实现的简单性之外,哪个选项最适合用来创建设置/配置文件呢?

3 个回答

5

ConfigParser的接口设计得很糟糕,ConfigObj听说不错,但我自己从没用过。对于ini文件,我一般会自己写一个解析器。

不过,像ini这样的格式其实对不同类型的数据、序列或者递归映射处理得都不好,所以我建议直接用yaml。yaml格式容易读懂,也好用编辑器来修改,还有一个标准的解析方式,而且没有像ini格式那样的缺点。

14

这要看你想在配置文件里存什么内容,以及你是怎么使用这些文件的。

  • 如果你需要进行“往返转换”(就是把yaml转成代码再转回yaml),并且希望保留注释,那么你不能使用 PyYAMLConfigParser

  • 如果你想保留键的顺序(比如在你提交配置文件时),那么 PyYAML 默认是做不到的,除非你特别指定 !!omap(这会让更新变得不那么方便)。

  • 如果你需要有复杂的结构,比如包含映射或字典的无名元素列表,那么 ConfigParserConfigObj 就不适合了,因为INI文件的键值对必须放在不同的部分,而列表只能作为值存在。

ruamel.yaml 这个YAML读取器的实现支持上述所有功能¹。 我已经使用fuzzyman的优秀 ConfigObj 来保留注释的往返转换很长时间了,同时也用过 PyYAML 来处理更复杂的结构,这两者结合起来效果最好。 ruamel.yaml 还包含一个 yaml 工具,可以把 ConfigObj 的INI文件转换成YAML格式。


¹ ruamel.yaml 是一个支持YAML 1.2的库(我推荐使用这个,因为我是这个包的作者)。而 PyYAML 只支持大部分的YAML 1.1。

13

使用ConfigObj非常简单,而ini文件通常比YAML文件更简单(而且使用得更广泛)。对于更复杂的情况,比如需要验证、默认值和类型,ConfigObj提供了一种通过configspec验证来实现这些功能的方法。

下面是一个用ConfigObj读取ini文件的简单代码:

from configobj import ConfigObj

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

它会自动处理列表值,并且支持多行值。如果你修改了配置文件,还可以把它写回去,同时保留原来的顺序和注释。

想了解更多信息,包括类型验证的例子,可以看看这些文章:

撰写回答