ConfigObj/ConfigParser 与 YAML 在 Python 配置文件中的对比
在为Python程序创建设置文件时,使用内置模块(ConfigParser)、独立项目(ConfigObj)还是YAML数据序列化格式,哪个更好呢?我听说ConfigObj比ConfigParser更容易使用,尽管它不是内置库。我也读到过PyYAML很简单,不过YAML的使用可能需要花点时间。除了实现的简单性之外,哪个选项最适合用来创建设置/配置文件呢?
3 个回答
ConfigParser的接口设计得很糟糕,ConfigObj听说不错,但我自己从没用过。对于ini文件,我一般会自己写一个解析器。
不过,像ini这样的格式其实对不同类型的数据、序列或者递归映射处理得都不好,所以我建议直接用yaml。yaml格式容易读懂,也好用编辑器来修改,还有一个标准的解析方式,而且没有像ini格式那样的缺点。
这要看你想在配置文件里存什么内容,以及你是怎么使用这些文件的。
如果你需要进行“往返转换”(就是把yaml转成代码再转回yaml),并且希望保留注释,那么你不能使用
PyYAML
或ConfigParser
。如果你想保留键的顺序(比如在你提交配置文件时),那么
PyYAML
默认是做不到的,除非你特别指定!!omap
(这会让更新变得不那么方便)。如果你需要有复杂的结构,比如包含映射或字典的无名元素列表,那么
ConfigParser
和ConfigObj
就不适合了,因为INI文件的键值对必须放在不同的部分,而列表只能作为值存在。
ruamel.yaml
这个YAML读取器的实现支持上述所有功能¹。 我已经使用fuzzyman的优秀 ConfigObj
来保留注释的往返转换很长时间了,同时也用过 PyYAML
来处理更复杂的结构,这两者结合起来效果最好。 ruamel.yaml
还包含一个 yaml
工具,可以把 ConfigObj
的INI文件转换成YAML格式。
¹ ruamel.yaml 是一个支持YAML 1.2的库(我推荐使用这个,因为我是这个包的作者)。而 PyYAML
只支持大部分的YAML 1.1。
使用ConfigObj非常简单,而ini文件通常比YAML文件更简单(而且使用得更广泛)。对于更复杂的情况,比如需要验证、默认值和类型,ConfigObj提供了一种通过configspec验证来实现这些功能的方法。
下面是一个用ConfigObj读取ini文件的简单代码:
from configobj import ConfigObj
conf = ConfigObj('filename.ini')
section = conf['section']
value = section['value']
它会自动处理列表值,并且支持多行值。如果你修改了配置文件,还可以把它写回去,同时保留原来的顺序和注释。
想了解更多信息,包括类型验证的例子,可以看看这些文章: