配置文件格式,复杂数据结构(列表,词典),注释,可编辑

时间:2015-04-02 14:22:18

标签: python config

我长期以来一直使用普通的python文件进行配置。我可以包含注释(提醒我,如果变量名称不够,那么条目是什么)并支持列表和词典。

现在我需要为客户导入这个东西似乎有点危险,因为如果他们手动编辑错误,它可能会破坏系统。

将来我希望能够在程序中更新文件,并且能够使用普通编辑器进行编辑(并且不必匹配<>()

  • XML不合适,因为它是ascii伪装的二进制文件
  • .ini文件的层次结构很少
  • JSON无法处理评论。

我现在正在考虑向JSON添加注释,但这基本上需要重写解析器以保留注释。而且JSON的可读性不是很好。

.ini个文件的ConfigObj库可以保留注释,但.ini可以满足我的需求(包含值为dicts列表的dicts列表)。

我应该使用其他配置文件格式吗?或者我应该在导入它们之前以安全的方式解析我的.py文件(这也允许再次将它们写出来)?

3 个答案:

答案 0 :(得分:2)

Chazeon和jme表示你应该看看YAML。它支持嵌套数据结构(列表(YAML中的序列),dict(映射)和各种基元(整数,浮点数,字符串,日期)。

YAML还支持行尾注释(与#一起引入),但Chazeon提到的“标准”PyYAML解析器会在读取数据时抛弃它们(并且不能写入这些)。 / p>

派生自PyYAML的包ruamel.yaml(我是作者)在进行往返时保留了注释(YAML文件到python数据结构到YAML文件)。它还保留了大部分YAML格式(块与列表和词典的单行)。

缩进然而是“标准化的”,因此在第一次往返之后所有块映射和序列看起来都相同。缩进默认为两个空格,但是这些可以单独设置,以及短划线可以在序列元素之前的空间内“推入”使用例如yaml.indent(mapping=3, sequence=5, offset=2)

答案 1 :(得分:1)

你考虑过YAML吗?它可以以#开头,而PyYAML等解析器已经存在。

据我所知,像MongoDB这样的一些比较大的程序正在使用YAML作为配置文件,有些程序使用YAML在文件前面存储元数据,例如,Pandoc支持yaml在Markdown和。

有关详细信息,您可以访问The Official YAML Website,其中提供了一些很好的示例和一些信息或维基百科页面。

答案 2 :(得分:1)

对我来说(只是我的意见)

我将使用JSON,因为它很小,易于阅读并且几乎可以与任何语言和平台兼容。 如需评论,我会使用一些关键字,例如“注释”并将其指定为JSON标记。无论如何,JSON将忽略未使用的标签。

JSON示例

{
    "param1" : "value1",
    "param2" : "value2",
}

带有我的评论的JSON示例

{
    "param1" : "value1",
    "param2" : "value2",
    "Comment" : "My Comment."
}

顺便说一下,根据我的经验,我们不能依赖客户编辑任何格式化的数据JSON,XML,ini甚至是YAML。他们会制造一些东西。