我即将推出自己的属性文件解析器。我需要能够在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
我以为我可以使用类似“元数据”的内容。'表示该行下面的任何内容都是要解析的元数据。然后,我会将属性看作几乎像java属性,我将读取每一行并构建一个地图(或对象)来保存元数据,然后通过一个简单的Web应用程序输出和搜索。
我自己推出这个问题之前的真正问题是,是否有人可以提出更好的方法来解决这个问题?适合此用例的特定数据格式或库?我通常会使用类似yaml之类的东西,但是在保存数据时,验证数据确实是yaml格式是没有好办法的。
答案 0 :(得分:0)
YAML是一个简单而好的解决方案。 Python中有一个YAML library:
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
你也可以从字符串中解析。只需探索它并检查它是否适合您的要求。
祝你好运!答案 1 :(得分:0)
你有3个问题:
如何将两个不同的东西放在一个盒子里。
如果您正在混合自由格式文本和更严格定义的内容,那么您总是会遇到无法解析的内容。那么你将有一场永无止境的战斗,试图处理投入的垃圾。真的没有别的办法吗?
如何定义元数据的简单格式,该格式足够强大,可以简单使用。
这是一个难题 - 所有这样做的尝试似乎都会扩大,直到它们变得非常复杂(例如YAML)。您可能对您的域名有自定义要求,因此您提出的建议可能是最佳的。
如何解析该格式。
为此我建议parsy。
在.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']],
'')