0

次のようなjsonファイルがあります。たとえば、イベントを抽出する必要があります。「APP_STARTED」「ORIENTATION」など

{u'ParamElement_ReceivedTime': u'2012-11-02-00-05-31-748', 
 u'ParamElement_Name': u'LOG_CONTENT', 
 u'ParamElement_Info_0': 
                 {u'dict': 
                      {u'Events_list': [
                          {
                           u'Event': u'APP_STARTED', 
                           u'time': u'2012-11-01 20:00:59.565 -0400'}, 
                          {
                            u'time': u'2012-11-01 20:01:01.168 -0400', 
                            u'Event': u'ORIENTATION', 
                            u'Orientation': u'Portrait'}, 

                          {u'Event': u'CLIENT_RESULT_RECEIVED', 
                           u'time': u'2012-11-01 20:01:15.927 -0400'}, 

                          {u'Prev_SessionID': u'802911CC329E47139B61B58E21BF2FFF', 
                           u'Prev_TransactionID': u'2', 
                           u'Tab_Index': u'5', 
                           u'time': u'2012-11-01 20:01:15.941 -0400', 
                           u'Event': u'RESOLVED_TAB', 
                           u'Accuracy': u'5.000000'}, 

                          {u'Prev_TransactionID': u'2', 
                           u'Prev_SessionID': u'802911CC329E47139B61B58E21BF2FFF', 
                           u'Event': u'CLIENT_RESULT_RECEIVED', 
                           u'time': u'2012-11-01 20:01:16.568 -0400'}
                    }

すべてが event_dict という変数に格納されます。次のようなコードがあります。

if event_dict:
      if 'dict' in event_dict['ParamElement_Info_0']:
          if 'el' in event_dict['ParamElement_Info_0']['dict']:
           if 'e' in event_dict['ParamElement_Info_0']['dict']['el']:
             print e['Event']  

何が間違いでしょうか?

4

3 に答える 3

3

Python のアプローチは、許可ではなく許しを求めることであり、個別に処理する必要がある場合を除いて、try-catchブロックを使用する方が簡単で優れています。condition checkscondition fail

try:
    event = event_dict['ParamElement_Info_0']['dict']['Events_list']
except Exception, e:
    log('Opsss, incorrect data format: %s' % e.message)

そうすれば、エラーを簡単に確認できます。

于 2013-03-13T16:44:50.407 に答える
2

変数を定義することはありません。最後の行は、前の行のような条件ではなくe、ループにする必要があります。

for e in event_dict['ParamElement_Info_0']['dict']['el']:
    print e

また、修正されたコードを作成して、"el"言う必要があるときに言うと思います:"Events_list"

if event_dict:
      if 'dict' in event_dict['ParamElement_Info_0']:
          if 'Events_list' in event_dict['ParamElement_Info_0']['dict']:
              for e in event_dict['ParamElement_Info_0']['dict']['Events_list']:
                  print e
于 2013-03-13T16:35:11.603 に答える
2

辞書に 'el' 要素がありません。a を書くfor A in Bと、反復可能な B の内容を保持する変数 A を作成しています。キー「el」が私の辞書にある場合、あなたが言っていることは...そうではありません。しかし、Events_list は @David が指摘するとおりです。

これがより簡単なアプローチかもしれません。

def item_getter(struct, key):
    parts = key.split('.', 1)
    if len(parts) > 1:
        key_part, rest_part = parts
        return item_getter(struct.get(key_part, {}), rest_part)
    return struct.get(key, None)

items = item_getter(event_dict, "ParamElement_Info_0.dict.Events_list")
events = [item.get('Event', 'No Event') for item in items]
print events

出力

[u'APP_STARTED', u'ORIENTATION', u'CLIENT_RESULT_RECEIVED', u'RESOLVED_TAB', u'CLIENT_RESULT_RECEIVED']
于 2013-03-13T16:47:28.420 に答える