用python解析数据文件(2.5.2)

用python解析数据文件(2.5.2),python,parsing,dictionary,Python,Parsing,Dictionary,我有一个如下的消息定义文件 struct1 { field="name" type="string" ignore="false"; field="id" type="int" enums=" 0="val1" 1="val2" "; } struct2 { field = "object" type="struct1"; ... } 如何将其解析到一个带有键“struct1,struct2”的字典中,并且值应该是一个字典列表,每个字典对应于相应的行号,以便执行以下操作

我有一个如下的消息定义文件

struct1 
{
  field="name" type="string" ignore="false"; 
  field="id" type="int" enums=" 0="val1" 1="val2" ";
}

struct2
{
  field = "object" type="struct1";
  ...
}
如何将其解析到一个带有键“struct1,struct2”的字典中,并且值应该是一个字典列表,每个字典对应于相应的行号,以便执行以下操作

dict['struct1'][0]['type'] // Would return 'string'
dict['struct1'][1]['type'] // Would return 'int'
dict['struct1'][1]['enums']['0'] // Would return 'val1'
dict['struct2'][0]['type'] // Would return 'struct1'
等等

此外,我可以更改定义文件的格式,如果你们中的任何人对修改定义文件格式以使其更易于解析有任何建议,请告诉我

谢谢

Use可以用作文件格式,它支持(用python术语)字典和列表。由于json支持仅适用于python 2.6及更高版本,因此您需要以下库:

python部件(草图,未测试):

Use可以用作文件格式,它支持(用python术语)字典和列表。由于json支持仅适用于python 2.6及更高版本,因此您需要以下库:

python部件(草图,未测试):

改用。有一个python库。它被谷歌AppEngine大量使用

这只是一个友好的建议:-)

示例(将标量映射到序列):

当然还有JSON,它在Python上有足够的支持(但往往会伤到我的手指;-)

改用它。有一个python库。它被谷歌AppEngine大量使用

这只是一个友好的建议:-)

示例(将标量映射到序列):


当然还有JSON,它对Python有着充分的支持(但往往会伤到我的手指;-)

我可以推荐一下吗?IMHO语法对于数据输入更具可读性,这样您就不必编写和维护解析器了。避免使用XML——它有利于标记文本,但不利于数据输入,因为文本不是人类可读的,到处都是重复的标记。

我可以推荐吗?IMHO语法对于数据输入更具可读性,这样您就不必编写和维护解析器了。避免使用XML——它有利于标记文本,但不利于数据输入,因为文本不是人类可读的,到处都是重复的标记。

由于您可以随意更改文件格式,因此可以将其更改为具有Python库的读写格式中的任意一种。例如,JSON、YAML、XML,甚至是内置的


由于您可以随意更改文件格式,因此可以将其更改为可读取和写入Python库的多种格式中的任意一种。例如,JSON、YAML、XML,甚至是内置的


Pyparsing是一个很好的易于使用的库。这就是我要用的


Pyparsing是一个很好的易于使用的库。这就是我要用的


我只想使用Python作为消息定义文件格式

将消息定义文件设为普通Python文件:

# file messages.py
messages = dict(
    struct1=[
        dict(field="name", type="string", ignore=False),
        dict(field="id", type="int", enums={0: "val1", 1: "val2"}),
        ],
    struct2=[
        dict(field="object", type="struct1"),
        ]
    )
然后,您的程序可以直接导入和使用该数据结构:

# in your program
from messages import messages
print messages['struct1'][0]["type"]
print messages['struct1'][1]['type']
print messages['struct1'][1]['enums'][0]
print messages['struct2'][0]['type']
使用这种方法,您可以让Python为您进行解析

你也获得了很多可能性。例如,假设您(出于某种奇怪的原因)有一个包含1000个名为“field\N”字段的消息结构。使用传统的文件格式,您必须添加1000行字段定义(除非您在配置文件解析器中构建了一些循环-然后您就可以创建编程语言了)。为此,使用Python可以执行以下操作:

messages = dict(
    ...
    strange_msg=[dict(field="field_%d" % i) for i in range(1000)],
    ...
    )
顺便说一句,在Python2.6上,可以选择使用命名元组而不是dict。或者在众多可用的“Bunch”类中使用(请参阅Python cookbook,了解2.5的namedtuple)

编辑:

下面是读取命令行上指定的消息定义文件的代码。它使用
execfile
而不是
import

# file mainprogram.py

def read_messages_from_file(filename):
    module_dict = {}
    execfile(filename, module_dict)
    return module_dict['messages']

if __name__ == "__main__":
    from pprint import pprint
    import sys

    for arg in sys.argv[1:]:
        messages = read_messages_from_file(arg)
        pprint(messages)
执行:

$ python mainprogram.py messages1 messages2 messages3

将读取并打印每个文件中定义的消息。

我只需使用Python作为消息定义文件格式

将消息定义文件设为普通Python文件:

# file messages.py
messages = dict(
    struct1=[
        dict(field="name", type="string", ignore=False),
        dict(field="id", type="int", enums={0: "val1", 1: "val2"}),
        ],
    struct2=[
        dict(field="object", type="struct1"),
        ]
    )
然后,您的程序可以直接导入和使用该数据结构:

# in your program
from messages import messages
print messages['struct1'][0]["type"]
print messages['struct1'][1]['type']
print messages['struct1'][1]['enums'][0]
print messages['struct2'][0]['type']
使用这种方法,您可以让Python为您进行解析

你也获得了很多可能性。例如,假设您(出于某种奇怪的原因)有一个包含1000个名为“field\N”字段的消息结构。使用传统的文件格式,您必须添加1000行字段定义(除非您在配置文件解析器中构建了一些循环-然后您就可以创建编程语言了)。为此,使用Python可以执行以下操作:

messages = dict(
    ...
    strange_msg=[dict(field="field_%d" % i) for i in range(1000)],
    ...
    )
顺便说一句,在Python2.6上,可以选择使用命名元组而不是dict。或者在众多可用的“Bunch”类中使用(请参阅Python cookbook,了解2.5的namedtuple)

编辑:

下面是读取命令行上指定的消息定义文件的代码。它使用
execfile
而不是
import

# file mainprogram.py

def read_messages_from_file(filename):
    module_dict = {}
    execfile(filename, module_dict)
    return module_dict['messages']

if __name__ == "__main__":
    from pprint import pprint
    import sys

    for arg in sys.argv[1:]:
        messages = read_messages_from_file(arg)
        pprint(messages)
执行:

$ python mainprogram.py messages1 messages2 messages3

将读取并打印每个文件中定义的消息。

如何编写嵌套字典部分?就像我想要enum作为第二行中的字典一样,我喜欢这个答案,所以upvote,但我发现我无法在生产环境中安装插件,因此无法使用此方法。我将如何编写嵌套字典部分?就像我希望enum作为第二行中的字典一样,我喜欢这个答案,因此upvote,但我发现我无法在生产环境中安装插件,因此无法使用此方法。对于上述2个结构,YAML中的文件格式是什么?你能举个例子吗?对于上面的2个结构,YAML中的文件格式是什么?你能举个例子吗?如果我有3个独立的文件,我写脚本时不知道它们的名字。我希望文件名作为参数传入。那该怎么做呢?我可以看到这样做的好处,但感觉很糟糕,就像一个巨大的安全风险。或者是让你的代码奇迹般地混乱的机会。我不确定这是否合理