JSON似乎在以下声明中打嗝:
{"delete":{"status":{"id":12600579001,"user_id":55389449}}}
代码段:
temp = json.loads(line)
text = temp['text']
当上面的代码片段遇到类似于上面的JSON'字典'的行时,我得到以下错误输出:
text = temp['text']
KeyError: 'text'
是因为该行中没有“text”键,还是因为“delete”不在字典中?
答案 0 :(得分:7)
是因为该行中没有“text”键,还是因为“delete”不在字典中?
这是因为没有“文本”键。如果您print temp
或检查密钥'text'
是否在生成的Python字典中,您会注意到没有名为'text'
的密钥。实际上,temp
只有一个密钥:'delete'
。 'delete'
引用的词典包含单个键'status'
,其中包含另一个包含两个键的词典:'user_id'
和'id'
。
换句话说,你的结构就是这样:
{
"delete" : {
"status" : {
"id" : 12600579001,
"user_id" : 55389449
}
}
}
如您所见,任何地方都没有“文字”键。
此外,您可以自己检查:
>>> 'text' in temp
False
>>> 'delete' in temp
True
答案 1 :(得分:5)
看起来这是因为'text'不在那里。也许你可以使用像
这样的东西'text' in temp
在尝试使用之前检查'text'是否存在。
修改强>
我采用了评论中给出的示例,并添加了一个if / elif / else块。
#! /usr/bin/python
import sys
import json
f = open(sys.argv[1])
for line in f:
j = json.loads(line)
try:
if 'text' in j:
print 'TEXT: ', j['text']
elif 'delete' in j:
print 'DELETE: ', j['delete']
else:
print 'Everything: ', j
except:
print "EXCEPTION: ", j
样本块#1:
{u'favorited':False,u'contributors':None,u'truncated':False,u'text':---- snip ----}
样本块#2:
{u'delete':{u'status':{u'user_id':55389449,u'id':12600579001L}}}
答案 2 :(得分:2)
在您发布的代码段中,看起来temp
应该只有一个项目,密钥为"delete"
。您没有密钥'text'
,因此我不确定temp['text']
应该查找哪些内容。
答案 3 :(得分:2)
尝试此操作以详细查看问题:
import json
line = '{"delete":{"status":{"id":12600579001,"user_id":55389449}}}'
print 'line:', line
temp = json.loads(line)
print 'temp:', json.dumps(temp, indent=4)
print 'keys in temp:', temp.keys()
生成此输出:
line: {"delete":{"status":{"id":12600579001,"user_id":55389449}}}
temp: {
"delete": {
"status": {
"user_id": 55389449,
"id": 12600579001
}
}
}
keys in temp: [u'delete']
temp
dict中唯一的关键是'删除'。因此temp['text']
会生成KeyError。
答案 4 :(得分:1)
为什么不把它放在第一行和第二行之间:
print temp
答案 5 :(得分:1)
尝试这样:
temp = json.load(line)
for lines in temp
text = lines['text']
答案 6 :(得分:0)
感谢大家的建议。问题的核心是Twitter json格式在字典中有一个字典。该解决方案涉及一个双索引来获取我需要检查的变量。
答案 7 :(得分:0)
#!/usr/bin/env python
import sys
import json
from pprint import pprint
json_file=sys.argv[1]
json_data=open(json_file)
j = json.load(json_data)
def main():
for attribute_key in j['root_attribute']:
try: print attribute_key['name'], attribute_key['status'], attribute_key['text']
except KeyError: pass
if __name__ == "__main__":
main()
答案 8 :(得分:0)
如果缺少密钥时出现 valid 情况,请使用dict.get(key[, default]):
temp.get('text')
而非temp['text']
不会引发异常,但是如果找不到密钥,则返回Null
。
EAFP(比许可更容易寻求宽恕)比LBYL(越过跳跃先看看)更具Python感。
答案 9 :(得分:0)
仅是经过验证的答案的更新版本。
如果该错误发生的频率(意味着变量text
在json文件中不存在)低于50%,那么解决方法就是找到所需的答案。
但是,如果异常确实很特殊,则应使用
try:
#your code here
except KeyError:
continue