如何从 PyParsing 中的结果对象中检索值列表?
How to retrieve list of values from result object in PyParsing?
我有一个简单的例子,我想解析 2 行数据。
In [1] from pyparsing import Word, nums, OneOrMore, Optional, Suppress, alphanums, LineEnd, LineStart
Float = Word(nums + '.' + '-')
Name = Word(alphanums)
Line = OneOrMore(Float)('data') + Suppress(Optional(';')) + Optional('%') + Optional(Name)('name')
Lines = OneOrMore(Line + LineEnd())
string = ''' 1 10 0 T20
1 76 0 T76
'''
result = Lines.parseString(string)
In [2] result
Out[2] (['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n'], {'data': [(['1', '10', '0'], {}), (['1', '76', '0'], {})], 'name': ['T20', 'T76']})
结果对象包含我需要的所有值,即 data
和 name
键的值是包含基于行排序的项目的列表。如何从结果对象中获取值?
访问数据属性不会同时给出两行
In [3] result.data
Out[3] (['1', '76', '0'], {})
In [4] for i in result.data:
print i
1
76
0
asDict()
方法returns只有第二行
In [5]: result.asDict()
Out[5]: {'data': ['1', '76', '0'], 'name': 'T76'}
asList()
方法returns所有信息在一个列表中,当你不知道name
和data
的长度时很难枚举提前
In [6]: result.asList()
Out[6]: ['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n']
asXML()
包含我需要的所有内容,但它是 XML 格式,并且文档字符串表示它将很快被弃用。
In [7]: print result.asXML() # The documentation says this will be deprecated
<data>
<data>1</data>
<ITEM>10</ITEM>
<ITEM>0</ITEM>
<name>T20</name>
<ITEM>
</ITEM>
<data>1</data>
<ITEM>76</ITEM>
<ITEM>0</ITEM>
<name>T76</name>
<ITEM>
</ITEM>
</data>
dump()
再次部分包含相关信息,但它 returns 一个字符串,并且必须再次解析该字符串以获取信息。
In [8]: print result.dump()
['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n']
- data: ['1', '76', '0']
- name: 'T76'
如何以 Pythonic 方式获取这些值?
在使用结果名称方面做得很好,它们在访问已解析的字段时非常有用。但听起来您需要向解析器添加一层结构化,以便每一行都有自己的数据、名称等。您只需将 Lines 重新定义为:
Lines = OneOrMore(Group(Line) + LineEnd().suppress())
现在,如果你打印(result.dump()),你会得到:
[['1', '10', '0', 'T20'], ['1', '76', '0', 'T76']]
[0]:
['1', '10', '0', 'T20']
- data: ['1', '10', '0']
- name: 'T20'
[1]:
['1', '76', '0', 'T76']
- data: ['1', '76', '0']
- name: 'T76'
dump() 的输出并不意味着要被解析以获取值,它旨在帮助向您展示如何检索结构化值。例如,您可以这样做:
print(result[1].data)
print(result[1].name)
并得到
['1', '76', '0']
T76
或:
for parsed_line in result:
print("{name}: {data}".format_map(parsed_line))
并得到:
T20: ['1', '10', '0']
T76: ['1', '76', '0']
我有一个简单的例子,我想解析 2 行数据。
In [1] from pyparsing import Word, nums, OneOrMore, Optional, Suppress, alphanums, LineEnd, LineStart
Float = Word(nums + '.' + '-')
Name = Word(alphanums)
Line = OneOrMore(Float)('data') + Suppress(Optional(';')) + Optional('%') + Optional(Name)('name')
Lines = OneOrMore(Line + LineEnd())
string = ''' 1 10 0 T20
1 76 0 T76
'''
result = Lines.parseString(string)
In [2] result
Out[2] (['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n'], {'data': [(['1', '10', '0'], {}), (['1', '76', '0'], {})], 'name': ['T20', 'T76']})
结果对象包含我需要的所有值,即 data
和 name
键的值是包含基于行排序的项目的列表。如何从结果对象中获取值?
访问数据属性不会同时给出两行
In [3] result.data
Out[3] (['1', '76', '0'], {})
In [4] for i in result.data:
print i
1
76
0
asDict()
方法returns只有第二行
In [5]: result.asDict()
Out[5]: {'data': ['1', '76', '0'], 'name': 'T76'}
asList()
方法returns所有信息在一个列表中,当你不知道name
和data
的长度时很难枚举提前
In [6]: result.asList()
Out[6]: ['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n']
asXML()
包含我需要的所有内容,但它是 XML 格式,并且文档字符串表示它将很快被弃用。
In [7]: print result.asXML() # The documentation says this will be deprecated
<data>
<data>1</data>
<ITEM>10</ITEM>
<ITEM>0</ITEM>
<name>T20</name>
<ITEM>
</ITEM>
<data>1</data>
<ITEM>76</ITEM>
<ITEM>0</ITEM>
<name>T76</name>
<ITEM>
</ITEM>
</data>
dump()
再次部分包含相关信息,但它 returns 一个字符串,并且必须再次解析该字符串以获取信息。
In [8]: print result.dump()
['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n']
- data: ['1', '76', '0']
- name: 'T76'
如何以 Pythonic 方式获取这些值?
在使用结果名称方面做得很好,它们在访问已解析的字段时非常有用。但听起来您需要向解析器添加一层结构化,以便每一行都有自己的数据、名称等。您只需将 Lines 重新定义为:
Lines = OneOrMore(Group(Line) + LineEnd().suppress())
现在,如果你打印(result.dump()),你会得到:
[['1', '10', '0', 'T20'], ['1', '76', '0', 'T76']]
[0]:
['1', '10', '0', 'T20']
- data: ['1', '10', '0']
- name: 'T20'
[1]:
['1', '76', '0', 'T76']
- data: ['1', '76', '0']
- name: 'T76'
dump() 的输出并不意味着要被解析以获取值,它旨在帮助向您展示如何检索结构化值。例如,您可以这样做:
print(result[1].data)
print(result[1].name)
并得到
['1', '76', '0']
T76
或:
for parsed_line in result:
print("{name}: {data}".format_map(parsed_line))
并得到:
T20: ['1', '10', '0']
T76: ['1', '76', '0']