使用 python 和 运行 将 JSON 数据提取到 keyerror

Extracting JSON data using python and running into keyerror

我正在尝试使用 python 提取 json 文件数据,但 运行 出现一些错误。

aircraft.json(json 文件):

{ "now" : 1609298440.3,
  "messages" : 31501,
  "aircraft" : [
    {"hex":"abadf9","alt_baro":37000,"alt_geom":36625,"gs":541.9,"track":73.3,"baro_rate":0,"version":0,"nac_p":7,"nac_v":1,"sil":2,"sil_type":"unknown","mlat":[],"tisb":[],"messages":13,"seen":6.6,"rssi":-25.3},
    {"hex":"acc02b","flight":"SWA312  ","alt_baro":37000,"alt_geom":36650,"gs":549.3,"track":62.2,"baro_rate":0,"category":"A3","nav_qnh":1013.6,"nav_altitude_mcp":36992,"nav_heading":56.2,"lat":42.171346,"lon":-93.298198,"nic":8,"rc":186,"seen_pos":66.3,"version":2,"nic_baro":1,"nac_p":8,"nac_v":1,"sil":3,"sil_type":"perhour","gva":1,"sda":2,"mlat":[],"tisb":[],"messages":1205,"seen":7.4,"rssi":-26.0},
    {"hex":"ac9e9a","category":"A4","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":746,"seen":119.1,"rssi":-26.6},
    {"hex":"a96577","flight":"DAL673  ","alt_baro":40025,"alt_geom":39625,"gs":371.4,"track":265.1,"baro_rate":0,"squawk":"2641","emergency":"none","category":"A4","nav_qnh":1013.6,"nav_altitude_mcp":40000,"nav_heading":258.8,"lat":42.057220,"lon":-94.098337,"nic":8,"rc":186,"seen_pos":0.9,"version":2,"nic_baro":1,"nac_p":9,"nac_v":1,"sil":3,"sil_type":"perhour","gva":2,"sda":2,"mlat":[],"tisb":[],"messages":3021,"seen":0.3,"rssi":-21.8},
    {"hex":"aa56db","category":"A3","version":2,"sil_type":"perhour","mlat":[],"tisb":[],"messages":1651,"seen":85.3,"rssi":-26.4}
  ]
}

我的代码:

import json

json_file = open('test.json')

aircraft_json = json.load(json_file)


for i in aircraft_json['aircraft']:
    print(i['hex'],i['flight'],i['alt_baro'],i['alt_geom'],i['gs'],i['gs'],i['track'],i['baro_rate'],i[
    'category'],i['nav_qnh'],i['nav_altitude_mcp'],i['lat'],i['lon'],i['nic'],i['rc'],i['seen_pos'],i['version'],i['nic_baro'],i['nac_p'],i['nac_v'],i['sil'],i['sil_type'],i['gva'],i['sda'],i['mlat'],i['tisb'],i['messages'],i['seen'],i['rssi'])
    
json_file.close()

输出:

Traceback (most recent call last):
  File "/home/pi/aircraft_json_to_csv.py", line 11, in <module>
    print(i['hex'],i['flight'],i['alt_baro'],i['alt_geom'],i['gs'],i['gs'],i['track'],i['baro_rate'],i[
KeyError: 'flight

json 文件每秒更新一次,json 文件可能会丢失 'flight' 等键值或任何随机键值。我的问题是如果那个键丢失了那么如何用空 space 替换那些缺失的值而不会出现 keyerror.

谢谢

我的建议是给每个字段一个合适的默认值并将这些字段存储在字典中。

然后,不要假设该字段存在,而是检查该字段是否存在。如果没有,则应用默认值。

下面是一个简单的例子。

defaults dict 已经填充了一些可能的默认值 让您开始,您也可以向其中添加其余字段。

我调整了循环以遍历字典的键(可以说是所有已知字段),并为任何缺失的字段添加默认值。

import json

with open('aircraft.json') as json_file:
    aircraft_json = json.load(json_file)

defaults = {
    'alt_baro': 0,
    'alt_geom': 0,
    'version': 0,
    'baro_rate': 0,
    'mlat': [],
    'tisb': []
    # similarly for the other fields
}

for dat in aircraft_json['aircraft']:
    for field in defaults.keys():
        if field not in dat:
            dat[field] = defaults[field]
        print(dat[field], end=' ')
    print('')