Извлечение данных JSON с помощью python и запуск keyerror

#json #python-3.x #keyerror

#json #python-3.x #ошибка ключа

Вопрос:

Я пытаюсь извлечь данные файла json с помощью python, но запускаю некоторые ошибки.

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.

Спасибо

Ответ №1:

Мой совет состоял бы в том, чтобы присвоить каждому полю подходящее значение по умолчанию и сохранить эти поля в словаре.

Затем, вместо того чтобы предполагать, что поле присутствует, проверьте, существует ли оно. Если это не так, то примените значение по умолчанию.

Ниже приведен простой пример этого в действии.

Для начала в defaults dict было введено несколько возможных значений по умолчанию, к которым вы также должны добавить остальные поля.

Я адаптировал цикл для перебора ключей 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('')
 

Комментарии:

1. Спасибо вам за совет. Я обязательно попробую это.