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

Configuration file format, complex datastructures (list, dictionaries), comments, editable

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

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

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

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

.ini 文件有一个 ConfigObj 库,它保留了注释,但 .ini 对我的需要来说太平淡了(字典列表包含的值是字典列表)。

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

你考虑过 YAML 吗?它可以有以 # 开头的注释,并且一些解析器如 PyYAML 已经存在。

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

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

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

我将使用 JSON,因为它体积小、易于阅读并且与几乎所有语言和平台兼容。 对于评论,我将使用一些关键字,例如"Comment" 并将其分配为 JSON 标签。 JSON 无论如何都会忽略未使用的标签。

JSON

的例子
{
    "param1" : "value1",
    "param2" : "value2",
}

JSON 的示例以及我的评论

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

顺便说一句,根据我的经验,我们不能依赖客户来编辑任何格式化数据 JSON、XML、ini 甚至 YAML。他们会刹车的东西。

正如 Chazeon 和 jme 所指出的,您应该看看 YAML。它支持嵌套数据结构(列表(YAML 中的序列)、字典(映射)和各种基元(整数、浮点数、字符串、日期)。

YAML 还支持行尾注释(在 # 中引入),但是 Chazeon 提到的 "standard" PyYAML 解析器在读取数据时将其丢弃(并且无法写入这些)。

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

但缩进是 "standardised",因此所有块映射和序列在第一次往返后看起来都一样。两者的缩进默认为 2 spaces,但这些可以单独设置,并且破折号可以是 "pushed in" 在序列元素之前的 space 使用例如yaml.indent(mapping=3, sequence=5, offset=2)