2016-11-30 88 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括号是列表的一部分......它如何表示集合,我希望你不会把它当作一个字符串 –