【问题标题】:Extracting JSON data using python and running into keyerror使用python提取JSON数据并遇到keyerror
【发布时间】:2020-12-30 03:37:34
【问题描述】:

我正在尝试使用 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' 或任何随机键值。我的问题是,如果缺少该键,那么如何用空格替换那些缺失的值而不会出现 keyerror。

谢谢

【问题讨论】:

    标签: json python-3.x keyerror


    【解决方案1】:

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

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

    下面是一个简单的例子。

    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('')
    

    【讨论】:

    • 感谢您的建议。我一定会尝试的。
    猜你喜欢
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 2021-08-08
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多