2016-11-18 3 views
2

私は2行のデータを解析したいという簡単な例を持っています。PyParsingの結果オブジェクトから値のリストを取り出す方法は?

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()方法のみ第二の行を返す

In [5]: result.asDict() 
Out[5]: {'data': ['1', '76', '0'], 'name': 'T76'} 

asList()方法は、単一のリスト内のすべての情報を返し、それが困難です事前にnamedataの長さがわからないときに列挙するには

In [6]: result.asList() 
Out[6]: ['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n'] 

asXML()には必要なものすべてが含まれていますが、XML形式であり、docstringは間もなく廃止されると言います。再び

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()部分的に関連する情報が含まれていますが、それは文字列を返し、もう1つは情報のために再び文字列を解析する必要があります。

In [8]: print result.dump() 
     ['1', '10', '0', 'T20', '\n', '1', '76', '0', 'T76', '\n'] 
     - data: ['1', '76', '0'] 
     - name: 'T76' 

どのようにしてこれらの値をPythonの方法で取得しますか?

答えて

1

結果の名前を使ってうまくやっていますが、解析されたフィールドにアクセスする際に非常に役立ちます。しかし、それはあなたが行うことができ、それぞれの行はなど、独自のデータ、名前を取得するように、あなたのパーサーに構造化の層を追加する必要があるように聞こえることと同じように行を再定義することによって:今すぐ

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' 

ダンプの出力は()の値を取得するために解析されることを意味しない、構造化された値を取得する方法をお見せ助けるためのものです。

print(result[1].data) 
print(result[1].name) 

をして

['1', '76', '0'] 
T76 

またはget:たとえば、あなたが行うことができます

for parsed_line in result: 
    print("{name}: {data}".format_map(parsed_line)) 

とget:詳細かつ非常に有益な答えのための

T20: ['1', '10', '0'] 
T76: ['1', '76', '0'] 
+1

うわー感謝をポール。私はあなたが質問された質問にすばらしい答えを与えるだけでなく、いつもそこのいくつかのちょっとした情報を覗き見しています(私は今までformat_mapについて知りませんでした):)もう一度お礼とパッケージの素晴らしい仕事! – kdheepak

関連する問題