Python: извлечение данных из JSON Использование API, отправка в Excel. Ошибка получения типа: объект NoneType не является подписным - PullRequest
0 голосов
/ 11 января 2020

Новое с pyhton и API, но я пытаюсь собрать большой объем данных с сервера с помощью API. Скрипт работал до сегодняшнего дня, когда я наткнулся на ошибку типа для NoneType. Сделал распечатку данных в a для l oop, чтобы увидеть, где они оказались. Обнаружил виновника, теперь я пытаюсь выяснить, как его пропустить или установить значение по умолчанию.

Для большинства данных я получаю следующий ключ и значение из файла JSON:

элемент: 0: данные: ключ: ключ значения: ключ значения: значение

Но для пары указанных c элементов в JSON я получаю следующее:

элемент: 0: данные: ключ: []

Как заставить мой сценарий пропустить этот указанный ключ c или, по крайней мере, дать ему значение по умолчанию вместо того, чтобы убивать программу и мешать процессу писать в excel из-за ошибки TypeError?

for entry in search["items"]:
    info = entry['data']['info']
    info1 = entry['data']["info"]
    info2 = entry['data']["info"]
    info3 = entry['data']["info"]
    info5 = entry['data']["info"]
    info6= entry['data']["info"]
    info7= entry['data']["info"]
    info8= entry['data']["info"]
    info9= entry['type']
    info10= entry["subscription"]['info']
    info11= entry["subscription"]["info"]
    info12= entry["uid"]
    info13= entry["subscription"]["info"]
    info14= entry["info"]
    info15= entry['gateway']["info"]
    info16= entry['gateway']["info"]
    info17= entry['gateway']["info"]
    info18= entry['labels']
    info19= entry['info']
    a = int(last_comm or 0)/1000.0
    r = (datetime.datetime.fromtimestamp(a).strftime
         ('%Y-%m-%d %H:%M:%S'))
    last_sync = entry["lastSyncDate"]
    b = int(last_sync or 0)/1000.0
    t = (datetime.datetime.fromtimestamp(b).strftime
         ('%Y-%m-%d %H:%M:%S'))
    webbrowser.open(av + uid + av_end + company)
    count +=1
    print(f"Site Name: {siteName}\n\ninfo: {info}\tinfo2: {info2} \t"
            f"info1: {info1}\tField: {info3}\n\n"
            f"Field: {info4}\t"
            f"Field: {info}\tField: {signal}\n"
            f"Field: {fw}\nField: {device}\nField: {t}\n"
            f"Field: {SIM}\tField: {mdn}\nField: {uid}\n"
            f"Field: {ipAdd}\nField: {commStat}\n"
            f"Field: {serialNumber}\n"
            f"Field: {macAdd}\nField: {r}\n"
            f"Field: {imei}\n")

Ошибка возникает следующим образом:

info10 = entry ["subscription"] ['info']

TypeError: объект 'NoneType' не может быть подписан

1 Ответ

0 голосов
/ 11 января 2020

Вы должны добавить try, кроме block, к указанной функции c с проблемой.

https://docs.python.org/3/tutorial/errors.html

Так что, если проблема в этом поле info2 = entry['data']["info"]

, вам придется переписать его как

info1 = entry['data']["info"]
try:
    info2 = entry['data']["info"]
except TypeError:
    info2 = 0
info3 = entry['data']["info"]
info5 = entry['data']["info"]

Но на самом деле вам нужно больше узнать о структурах данных и повторителях, чтобы вам не пришлось так много повторяться в коде. Трудно сказать, как улучшить это без фактического набора данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...