Python - 任何属于自由格式的属性文件或数据格式?

时间:2017-10-24 15:40:47

标签: python parsing

我即将推出自己的属性文件解析器。我需要能够在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格式是没有好办法的。

2 个答案:

答案 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个问题:

  1. 如何将两个不同的东西放在一个盒子里。

    如果您正在混合自由格式文本和更严格定义的内容,那么您总是会遇到无法解析的内容。那么你将有一场永无止境的战斗,试图处理投入的垃圾。真的没有别的办法吗?

  2. 如何定义元数据的简单格式,该格式足够强大,可以简单使用。

    这是一个难题 - 所有这样做的尝试似乎都会扩大,直到它们变得非常复杂(例如YAML)。您可能对您的域名有自定义要求,因此您提出的建议可能是最佳的。

  3. 如何解析该格式。

    为此我建议parsy

    .metadata.上拆分文本然后解析剩下的文本会非常简单。

  4. 以下是使用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']],
     '')