0

我有一个看起来像这样的 json 文件:我将不得不提取事件,例如。'APP_STARTED' '方向' 等

{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 checks必须condition 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您正在创建一个变量 A 来保存可迭代 B 的内容。您正在做的是说,如果键 '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 回答