Python:合适的配置文件格式

8 投票
5 回答
10197 浏览
提问于 2025-04-15 23:45

我想使用一种配置文件格式,这种格式支持键值对和可以嵌套、重复的结构,而且语法尽量简单。我想要的格式大概是这样的:

cachedir = /var/cache
mail_to = me@example.org

job {
   name = my-media
   frequency = 1 day
   source {
      from = /home/michael/Images

   source { }
   source { }       
}

job { }

我也很乐意使用那种依赖空白字符的格式。

JSON的语法规则太多了,比如需要加引号、逗号等等。YAML其实还不错,但需要把工作定义成一个YAML列表,我觉得这样用起来有点别扭。

5 个回答

1

我觉得你可以看看 libconfig 这个库,地址是 http://www.hyperrealm.com/libconfig/。那里应该有适合 Python 的接口。

另外一个解决办法是使用 JSON 格式,这个格式 Python 自带就有。你可以查一下关于 JSON 模块的文档。

10

由于Python自带的configparser模块似乎不支持嵌套部分,我建议你可以先试试ConfigObj。你可以在这里找到一个入门教程。根据它的主页,这里有一些值得注意的功能:

  • 支持嵌套部分(子部分),可以嵌套到任何层级
  • 可以使用列表值
  • 支持多行值
  • 字符串插值(替换)
  • 集成了强大的验证系统
    • 包括自动类型检查/转换
    • 支持重复部分
    • 允许设置默认值
  • 在写出配置文件时,ConfigObj会保留所有注释以及成员和部分的顺序
  • 提供了许多有用的方法和选项来处理配置文件(比如'reload'方法)
  • 完全支持Unicode

ConfigObj被Bazaar、Trac、IPython、matplotlib以及许多其他大型Python项目使用,所以我觉得它相当成熟和稳定(虽然我自己从未使用过)。

13

我觉得YAML在这个情况下非常好用:

jobs:
 - name: my-media
   ...

 - name: something else
   ...

或者,你也可以用字典来代替列表:

jobs:
  my-media:
    frequency: 1 day
    ...
  something-else:
    frequency: 2 day
    ...

还有一个你可能没考虑到的点,就是可以用Python代码来做配置。你可以把Python的字典和列表嵌套在一起,这样看起来非常清晰,而且还有很多意想不到的好处。比如,Django就是用Python代码来写它的设置文件的。

撰写回答