Python解析含列表的字典触发KeyError的问题排查与解决
Python解析字典列表时KeyError问题的解决
问题说明
解析包含string、number、multipleChoice等多种类型字段的字典列表时,运行遍历代码触发KeyError: 'multipleChoiceValue',报错位置为循环语句for choice2 in fields2['value']['multipleChoiceValue']。排查发现数据中存在一条异常字段:{'value': {}, 'label': 'Room#', 'type': 'multipleChoice'},该字段类型标记为multipleChoice,但value是空字典,不存在multipleChoiceValue键,导致遍历时报错。
待解析数据
[ {'value': {'stringValue': 'My Name'}, 'label': "Submitter's Name", 'type': 'string'}, {'value': {'stringValue': 'Shipper name test'}, 'label': 'Shipper Name', 'type': 'string'}, {'value': {'stringValue': 'Consignee name test'}, 'label': 'Consignee', 'type': 'string'}, {'value': {'stringValue': '12345'}, 'label': 'Job #', 'type': 'string'}, {'value': {'numberValue': 67}, 'label': 'Temp', 'type': 'number'}, {'value': {'multipleChoiceValue': [{'selected': True, 'value': 'YES'}, {'selected': False, 'value': 'NO'}]}, 'label': 'Visual Inspection', 'type': 'multipleChoice'}, {'value': {'multipleChoiceValue': [{'selected': True, 'value': 'YES'}, {'selected': False, 'value': 'NO'}]}, 'label': 'Water', 'type': 'multipleChoice'}, {'value': {'multipleChoiceValue': [{'selected': True, 'value': 'YES'}, {'selected': False, 'value': 'NO'}]}, 'label': 'Feed', 'type': 'multipleChoice'}, {'value': {'multipleChoiceValue': [{'selected': True, 'value': 'YES'}, {'selected': False, 'value': 'NO'}]}, 'label': 'Lights', 'type': 'multipleChoice'}, {'value': {'multipleChoiceValue': [{'selected': True, 'value': 'YES'}, {'selected': False, 'value': 'NO'}, {'selected': False, 'value': 'Yes, but needs attention'}]}, 'label': 'Bed', 'type': 'multipleChoice'}, {'value': {'multipleChoiceValue': [{'selected': True, 'value': 'Vehicle 1'}, {'selected': False, 'value': 'Vehicle 3'}, {'selected': False, 'value': 'Vehicle 3'}, {'selected': False, 'value': 'Vehicle 4'}]}, 'label': 'Truck#', 'type': 'multipleChoice'}, {'value': {}, 'label': 'Room#', 'type': 'multipleChoice'}, {'value': {'multipleChoiceValue': [{'selected': True, 'value': 'NO'}, {'selected': False, 'value': 'YES'}]}, 'label': 'Last Submission for Trip?', 'type': 'multipleChoice'} ]
报错代码
for fields in response_data['data']['fields']: if fields['label'] == "Last Submission for Trip?": for choice in fields['value']['multipleChoiceValue']: if choice['value'] == "NO": if choice['selected'] == True: for fields2 in response_data['data']['fields']: if fields2['type'] == 'multipleChoice': for choice2 in fields2['value']['multipleChoiceValue']: print('selected') print('value')
解决方法
在判断字段类型为multipleChoice的条件中,增加对value是否为空字典的校验,过滤掉空值字段。修改后的判断条件为:
if fields2['type'] == 'multipleChoice' and fields2['value'] != {}:
修改后的完整代码示例:
for fields in response_data['data']['fields']: if fields['label'] == "Last Submission for Trip?": for choice in fields['value']['multipleChoiceValue']: if choice['value'] == "NO" and choice['selected'] == True: for fields2 in response_data['data']['fields']: if fields2['type'] == 'multipleChoice' and fields2['value'] != {}: for choice2 in fields2['value']['multipleChoiceValue']: print('selected') print('value')
内容的提问来源于stack exchange,提问作者C. Ayers
相关产品推荐
相关产品推荐

