2014-12-29 2 views
1

Я пытаюсь работать со словарями внутри списка в файле JSON. Данные импортируются штрафом и хорошо читаются. Для жизни я не могу понять, как распечатать ключи «member_id». Я просто хочу напечатать список чисел «member_id». Сначала я использовал json.loads, а затем переключился на json.dumps. Любая помощь будет действительно оценена.KeyError В Python С json.dumps

import urllib2 
import json 
nyt_api_key = '72c9a68bbc504e91a3919efda17ae621%3A7%3A70586819' 
url= 'http://api.nytimes.com/svc/politics/v3/us/legislative/congress/113' 
json_obj = urllib2.urlopen(url) 
data = json.load(json_obj) 
data2 = json.dumps(data, sort_keys=True, indent=True, skipkeys = True) 

print data2 

Выход из print data2: (список можно продолжать и дальше, так что обрезано Существует закрывающая скобка в нижней части списка Так что словари в списке...)

"positions": [ 
{ 
    "dw_nominate": "0.466", 
    "member_id": "A000055", 
    "vote_position": "Yes" 
}, 
{ 
    "dw_nominate": "0.995", 
    "member_id": "A000367", 
    "vote_position": "Yes" 
}, 
{ 
    "dw_nominate": "0.666", 
    "member_id": "A000369", 
    "vote_position": "Yes" 
}, 

выход из print data2['member_id'], выход то же самое при использовании 'позиции', 'vote_position', и т.д .:

Traceback (most recent call last): 
    File "/Users/Owner/PycharmProjects/untitled2/1", line 9, in <module> 
    print data2["positions"] 
TypeError: string indices must be integers, not str 

выход из print data:

u'positions': [{u'dw_nominate': u'0.466', u'vote_position': u'Yes', u'member_id': u'A000055'}, {u'dw_nominate': u'0.995', u'vote_position': u'Yes', u'member_id': u'A000367'}, {u'dw_nominate': u'0.666', u'vote_position': u'Yes', u'member_id': u'A000369'}

Выход из print data['positions']:

print data["positions"] KeyError: 'positions'

Выход из print.data(keys):

[u'status', u'results', u'copyright'] 

Process finished with exit code 0 
+1

'json.dumps' возвращает' string' и, следовательно, исключение. try 'print data ['member_id']' –

+0

'json.dumps' создает строку ** **, так что вы назначаете' data2' (из данных объекта ', который, по-видимому, является списком dicts). Что вы пытаетесь достичь?! –

+1

@AkashShende похоже, что 'data' - это список dicts, поэтому' data ['member_id'] 'также будет терпеть неудачу - что-то вроде' data [0] ['member_id'] 'может быть хорошо, но без идеи что OP пытается выполнить, это просто догадка :-) –

ответ

0

Поэтому я должен изменить заголовок этого слова на «Разрушение JSON для XML в Python». Я уверен, что не у всех остальных были бы те же проблемы, что и я с JSON, но после многих разочаровывающих часов я решил пойти по пути №2 ... xml-версии. Версия xml была намного проще работать прямо с ворот. Примерно в 1/10 время я получил то, что искал.

from urllib2 import urlopen 
from xml.dom import minidom 

feed = urlopen("http://api.nytimes.com/svc/politics/v3/us/legislative.xml? 

doc = minidom.parse(feed) 
id_element = doc.getElementsByTagName("member_id") 
id_number0 = id_element[0].childNodes[0].nodeValue #just a sample 
id_number1 = id_element[1].childNodes[0].nodeValue #just a sample 
id_number2 = id_element[2].childNodes[0].nodeValue #just a sample 

print len(id_element) #to see how many items were in the variable 


count = 0 
for item in id_element: 
    print id_element[count].childNodes[0].nodeValue 
    count = count + 1 
    if count == 434: 
    break 

Это определенно не самый чистый цикл. Я все еще работаю над этим. Но код решает проблему, которую я первоначально опубликовал. Ключ API не является фактическим, форматирование в окне ответа отбрасывает его, поэтому я просто удалил его. Вы можете найти API на веб-сайте разработчика NYT.

Спасибо всем, кто разместил.

1

data2 является строкой, она не имеет ключей. Я думаю, что вы хотите напечатать data["positions"]

Это странный результат из данных, у вас даже нет брекетов. Попробуйте распечатать type(data), это должно быть dict

1

Я просто хочу напечатать список номеров «member_id».

Так что вам нужно перебираем positions и получить доступ к member_id в каждом Dict:

data ={"positions": [ 
{ 
    "dw_nominate": "0.466", 
    "member_id": "A000055", 
    "vote_position": "Yes" 
}, 
{ 
    "dw_nominate": "0.995", 
    "member_id": "A000367", 
    "vote_position": "Yes" 
}, 
{ 
    "dw_nominate": "0.666", 
    "member_id": "A000369", 
    "vote_position": "Yes" 
}]} 

print([d["member_id"] for d in data["results"]["positions"]]) 
['A000055', 'A000367', 'A000369'] 

Если вы посмотрите на API documentation есть примеры каждого ответа JSon.

+0

, как только я получу его на работу, я опубликую ответ или работу –