Python-任何主要是自由格式的属性文件或数据格式



我即将推出我自己的属性文件解析器。我有一个有点奇怪的要求,我需要能够将元数据存储在GUI的现有字段中。数据需要易于解析和人类可读,最好在定义数据时具有一定的灵活性(例如,没有yaml)。

我在想我可以做这样的事情:

this is random text that is truly a description
.metadata.
owner.first: rick
owner.second: bob
property: blue
pets.mammals.dog: rufus
pets.mammals.cat: ludmilla

我想我可以使用类似".metadata."的东西来表示该行下面的任何内容都是要解析的元数据。然后,我会像对待java属性一样对待这些属性,在那里我会读取每一行,并构建一个映射(或对象)来保存元数据,然后通过一个简单的web应用程序输出和搜索元数据。

在我自己动手之前,我真正的问题是,有人能提出解决这个问题的更好方法吗?适合此用例的特定数据格式或库?我通常会使用类似yaml之类的东西,但在保存数据时,没有好的方法来验证数据是否确实是yaml格式的。

您有3个问题:

  1. 如何将两种不同的东西放入一个盒子中。

    如果你把自由形式的文本和定义更严格的东西混合在一起,你总是会得到无法解析的东西。然后,你将面临一场永无止境的战斗,试图处理被放入的垃圾。真的没有其他办法吗?

  2. 如何为元数据定义一个简单的格式,该格式足够健壮,可以简单使用。

    这是一个棘手的问题——所有这样做的尝试似乎都在扩展,直到它们变得相当复杂(例如YAML)。你可能会对你的域名有自定义的要求,所以你提出的可能是最好的。

  3. 如何解析该格式。

    为此,我推荐帕西。

    .metadata.上拆分文本,然后解析剩余内容,这将非常简单。

下面是一个使用parsy:的例子

from parsy import *
attribute = letter.at_least(1).concat()
name = attribute.sep_by(string("."))
value = regex(r"[^n]+")
definition = seq(name << string(":") << string(" ").many(), value)
metadata = definition.sep_by(string("n"))

示例用法:

>>> metadata.parse_partial("""owner.first: rick
owner.second: bob
property: blue
pets.mammals.dog: rufus
pets.mammals.cat: ludmilla""")
([[['owner', 'first'], 'rick'],
[['owner', 'second'], 'bob'],
[['property'], 'blue'],
[['pets', 'mammals', 'dog'], 'rufus'],
[['pets', 'mammals', 'cat'], 'ludmilla']],
'')

YAML是一个简单而好的解决方案。Python中有一个YAML库:

import yaml
output = {'a':1,'b':{'c':output = {'a':1,'b':{'c':[2,3,4]}}}}
print yaml.dump(output,default_flow_style=False)

给予作为结果:

a: 1
b:
c:
- 2
- 3
- 4

您也可以从字符串等进行解析。只需浏览它并检查它是否符合您的要求。

祝你好运!