配置文件格式、复杂数据结构(列表、字典)、注释、可编辑
Configuration file format, complex datastructures (list, dictionaries), comments, editable
我长期以来一直使用普通 python 文件进行配置。我可以添加注释(如果变量名不够用,提醒我条目的含义)并支持列表和字典。
既然我需要为客户导入一些东西,这似乎有点危险,因为如果他们手动编辑错误,它可能会破坏系统。
将来我希望能够从程序中更新文件,并且还能够使用普通编辑器对其进行编辑(并且更喜欢不必匹配 <>
或 ()
:
- XML 不合适,因为它是 ascii 伪装的二进制
- .ini 文件的层次结构很少
- JSON 无法处理评论。
我现在正在考虑向 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)
我长期以来一直使用普通 python 文件进行配置。我可以添加注释(如果变量名不够用,提醒我条目的含义)并支持列表和字典。
既然我需要为客户导入一些东西,这似乎有点危险,因为如果他们手动编辑错误,它可能会破坏系统。
将来我希望能够从程序中更新文件,并且还能够使用普通编辑器对其进行编辑(并且更喜欢不必匹配 <>
或 ()
:
- XML 不合适,因为它是 ascii 伪装的二进制
- .ini 文件的层次结构很少
- JSON 无法处理评论。
我现在正在考虑向 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)