2016-11-30 108 views
0

我從文件來源的Elasticsearch使用JSON的字典,看起來像這樣:的Python 2疊代嵌套JSON字典

{ 
    u'hits':{ 
     u'hits':[ 
     { 
      u'_score':1.0, 
      u'_type':u'input', 
      u'_id':u'1', 
      u'_source':{ 
       u'message':u'I really love fake news tho.' 
      }, 
      u'_index':u'gossip' 
     } 
     ], 
     u'total':1, 
     u'max_score':1.0 
    }, 
    u'_shards':{ 
     u'successful':1, 
     u'failed':0, 
     u'total':1 
    }, 
    u'took':3, 
    u'timed_out':False 
} 

有幾千個文件,我希望得到每個列表'消息'值。我嘗試了幾種方法,但似乎無法獲得正常運行的解決方案。我現在的嘗試是:

messages = es.search(index="gossip", _source=['message']) 
for key, value in messages.iteritems(): 
    print key, value 

導致:

hits{ 
    u'hits':[ 
     { 
     u'_score':1.0, 
     u'_type':u'input', 
     u'_id':u'1', 
     u'_source':{ 
      u'message':u'I really love fake news tho.' 
     }, 
     u'_index':u'gossip' 
     } 
    ], 
    u'total':1, 
    u'max_score':1.0 
}_shards{ 
    u'successful':1, 
    u'failed':0, 
    u'total':1 
} 

希望有人能輕推我在正確的方向。

+0

嘗試'消息[0] .itertools()' –

+0

否運氣'爲鍵,在信息中值[0] .itertools(): KeyError異常:0' – nmacc

+0

假定該您的文檔列表是一個名爲docs的數組,您是否可以像下面這樣引用它:docs'docs''hits'] ['hits'] [0] ['_ source'] ['message'] for doc in docs] ' – nb1987

回答

0

嘗試此 -

es_res = { 
    u'hits':{ 
     u'hits':[ 
     { 
      u'_score':1.0, 
      u'_type':u'input', 
      u'_id':u'1', 
      u'_source':{ 
       u'message':u'I really love fake news tho.' 
      }, 
      u'_index':u'gossip' 
     } 
     ], 
     u'total':1, 
     u'max_score':1.0 
    }, 
    u'_shards':{ 
     u'successful':1, 
     u'failed':0, 
     u'total':1 
    }, 
    u'took':3, 
    u'timed_out':False 
} 

print [ i['_source']['message'] for i in es_res['hits']['hits']] 
+0

一件事 - 首先嚐試一個子集,因爲如果響應很大,它將很難打印一個大的消息列表 –

+1

Works!返回'[我真的很喜歡假新聞']'所以我想現在我只需要努力擺脫括號和'u''。謝謝您的幫助! – nmacc

+0

@nmacc括號是列表的一部分......它如何表示集合,我希望你不會把它當作一個字符串 –