【问题标题】:KeyError In Python With json.dumps带有 json.dumps 的 Python 中的 KeyError
【发布时间】:2025-12-11 21:10:02
【问题描述】:

我正在尝试在 JSON 文件的列表中使用字典。数据导入良好,读取良好。对于我的生活,我无法弄清楚如何打印出“member_id”键。我只想打印“member_id”号码列表。我最初使用 json.loads,然后切换到 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']的输出,如果使用'positions','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

【问题讨论】:

  • json.dumps 返回string,因此出现异常。试试print data['member_id']
  • json.dumps 产生一个 string 这就是您分配给data2 的内容(来自对象data,这显然是一个字典列表)。你想完成什么?!
  • @AkashShende 看起来data 是一个字典列表,所以data['member_id'] 也会失败——data[0]['member_id'] 之类的东西可能没问题,但不知道 OP 试图做什么完成它本质上只是一个猜测:-)
  • @AlexMartelli,我只想打印“member_id”号码列表。
  • 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["member_id"]print data ["u'member_id"] 我仍然得到一个 KeyError。 @PadraicCunningham 下面提到的 for 循环返回 TypeError: string indices must be integers, not str。我还没有用尽那个解决方案,还在尝试一些事情。 @AlexMartelli @Akash 申德

标签: python xml json urllib2


【解决方案1】:

我只想打印“member_id”号码列表。

所以你需要遍历positions 并访问每个字典中的member_id

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 响应的示例。

【讨论】:

  • 一旦我得到它的工作,我会发布答案或解决方法
【解决方案2】:

data2 是一个字符串值,它没有键。我想你要打印的是data["positions"]

这是一个奇怪的数据输出,你甚至没有大括号。尝试打印type(data),应该是dict

【讨论】:

    【解决方案3】:

    所以我应该把这个标题改成 Scrapping JSON for XML in 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 密钥不是实际的,答案窗口中的格式将其丢弃,所以我只是删除了一堆。您可以在 NYT 开发者网站上找到 API。

    感谢所有发帖的人。

    【讨论】: