创建一个编译嵌套列表和字典的所有先前进程的函数后获取KeyError

问题描述 投票:0回答:1

我是初学者,我有一个关于使用Face API Microsoft测量情绪的项目,按照网页教程我获得了20张图像的情感评分--JSON文件。我希望在整个文件中平均有八种情绪。此JSON文件包含一个包含多个嵌套字典的列表。为什么嵌套字典找到密钥然后该函数带来KeyError?所以,我得到了这个错误,我无法得到平均的情绪,对于这个主题我回顾了这个答案(Python 3.4 - How to get the average of dictionary values?。)我感谢你的指导

首先,在整个文件中,我通过循环访问列表,并通过键访问字典;最后,我得到了最后一个值,这意味着只有一个图像的结果而不是20个作为我的总文件。测试通过函数来​​修复它,以编译嵌套列表和字典的所有先前过程,但我得到了一个KeyError。我多次查看代码,我知道密钥就在那里,但我无法弄清楚解决方案。

JSON文件的第一行(共20行):

<Response [200]>
Response:
[{'faceId': 'c7369e8f-c624-4404-8542-225ad7beb9f6', 'faceRectangle': {'top': 230, 'left': 16, 'width': 258, 'height': 258}, 'faceAttributes': {'emotion': {'anger': 0.001, 'contempt': 0.001, 'disgust': 0.0, 'fear': 0.0, 'happiness': 0.0, 'neutral': 0.993, 'sadness': 0.005, 'surprise': 0.0}}}]

我的代码:

Response= (batch_call_images(list_of_faces)) #whole JSON file

for question in Response: 
    print(question)

for question_data in question:
    print(question_data)

question_emotion= question_data['faceAttributes']
question_emotion

question_anger= question_emotion['emotion']['anger']
print(question_anger)
question_contempt= question_emotion['emotion']['contempt']
print(question_contempt)
question_disgust= question_emotion['emotion']['disgust']
print(question_disgust)
question_fear= question_emotion['emotion']['fear']
print(question_fear)
question_happiness= question_emotion['emotion']['happiness']
print(question_happiness)
question_neutral= question_emotion['emotion']['neutral']
print(question_neutral)
question_sadness= question_emotion['emotion']['sadness']
print(question_sadness)
question_surprise= question_emotion['emotion']['surprise']
print(question_surprise)

def result_emotions():
    for question in Response:
         for question_data in question:
             question_emotion=question_data['faceAttributes']['emotion']
             question_anger=question_emotion['emotion']['anger']
             question_contempt=question_emotion['emotion']['contempt']
             question_disgust= question_emotion['emotion']['disgust']
             question_fear= question_emotion['emotion']['fear']
             question_happiness= question_emotion['emotion']['happiness']
             question_neutral= question_emotion['emotion']['neutral']
             question_sadness= question_emotion['emotion']['sadness']
             question_surprise= question_emotion['emotion']['surprise']
             print(question_surprise= question_emotion['emotion']['surprise'])
result_emotions()

KeyError                                  Traceback (most recent call last)
<ipython-input-328-ac1f0aa1f86c> in <module>()
----> 1 result_emotions()

<ipython-input-327-0f09e398a9eb> in result_emotions()
  3             for question_data in question:
  4                 question_emotion=question_data['faceAttributes']['emotion'] #if adds it there are keyerror
----> 5                 question_anger=question_emotion['emotion']['anger']
      6                 question_contempt=question_emotion['emotion']['contempt']
      7                 question_disgust= question_emotion['emotion']['disgust']

KeyError: 'emotion'

我希望在整个Json文件中平均有八种情感类型,例如:愤怒:0.20,蔑视:0.15,厌恶:0.00,依此类推。

python azure dictionary nested keyerror
1个回答
0
投票

我不确定你的其余代码,但我会解决KeyError问题。你得到的回应是json结构中的文本。要在json中阅读它,您有两个选项,具体取决于您首先获得响应的方式。

如果你使用python requests模块,那么你可以使用my_response=Response.json()。现在,您将json对象存储在my_response中。在你的情况下

my_response=Response.json()
for question in my_response:
    print (question)
    #This will print a lot of dictionaries depending on your response
    for question_data in question:
        print (question[question_data])
        #This will print 
        #c7369e8f-c624-4404-8542-225ad7beb9f6
        #{'top': 230, 'left': 16, 'width': 258, 'height': 258}
        #'emotion': {'anger': 0.001, 'contempt': 0.001, 'disgust': 0.0, 'fear': 0.0, 'happiness': 0.0, 'neutral': 0.993, 'sadness': 0.005, 'surprise': 0.0} from your example

现在,您可以使用它来迭代并继续使用下面的代码

for question in my_response:
    question_emotion=question['faceAttributes']
    question_anger= question_emotion['emotion']['anger']

如果您没有使用python请求模块并且您在文本中得到了json响应,那么您现在必须使用python json模块。

import json
my_response= json.loads(Response.text)
#rest of the code is same as above

但是,我怀疑,你会从我看到的代码中发现更多问题。保持学习。

© www.soinside.com 2019 - 2024. All rights reserved.