Python 3, проблема с вызовом API

Использование Raspberry PI 3 для подключения к API MBTA

Я использую Raspberry Pi 3 для вызова транзитного API MBTA и получения обновленной информации для идентификаторов остановок. У меня есть код, который вызывает API и извлекает данные идентификатора остановки. У меня все это работало раньше, еще несколько дней назад. Проблема только с Красной линией для МБТА. Но когда я запускаю свой скрипт, он выдает это сообщение об ошибке.

Traceback (most recent call last):
File "APItest.py", line 23, in <module>
  currentstop[i] = stop_name(test[i]['id'])
TypeError: 'NoneType' object is not subscriptable

Для меня это странно, потому что это работает, когда я вызываю места остановки синей линии, я вообще не меняю код, кроме API, который вызываю. Я публикую код Python 3 ниже. Это призыв к красной линии. Единственное, что я меняю при вызове синей линии, это меняю переменную «line» на «Blue».

import requests
import json
from APIstops import stop_name

APIkey = '--------------------------' # My personal API access Key
line = 'Red' # Line will be testing with first
URL2 = "https://api-v3.mbta.com/vehicles?filter[route] = " + line  + "&api_key = " + APIkey # URL for calling red line specific
vehicles = requests.get(URL2) # gets vehicle data from API
dataV = vehicles.text # converts to text
parse_json = json.loads(dataV) # parses data to JSON format
MBTAV = parse_json['data'] # creates array of parsed data
vehicle_locals = dict() # creates a dictionary of current location of red line vehicles
test = dict()

for vehicle in MBTAV:
    vehicle_locals[vehicle['id']] = vehicle['relationships']['stop']['data'] # stores current stop for each train per given line
#print(vehicle_locals)
for i in range(0 , len(vehicle_locals)):
    test[i] = list(vehicle_locals.values())[i]
print(test[0]['id'])
currentstop = [None] * len(vehicle_locals)
for i in range(0, len(vehicle_locals)):
    currentstop[i] = stop_name(test[i]['id'])
print(currentstop)

Я не знаю, почему это работает для синего, а не для красного. Я посмотрел на API, и они оба выглядят одинаково.

Честно говоря, я не знаю, что еще попробовать.

URL-адрес API MBTA для красной линии

https://api-v3.mbta.com/vehicles?filter[route]=Red

URL-адрес API MBTA для синей линии

https://api-v3.mbta.com/vehicles?filter[route]=RedBlue

Ошибка сообщает вам, что test[i] есть None (окольным путем. На самом деле это вы используете оператор индекса [...] для чего-то, что не является словарем), поэтому: напечатайте test, чтобы узнать, какие элементы находятся там после ты заполняешь его.

Mike 'Pomax' Kamermans 08.06.2024 17:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
1
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто: иногда данные stop транспортного средства "stop":{"data":null}:

Screenshot of JSON data showing this case

Итак, в словаре у вас окажется None, и пытаться поработать над этим бесполезно.

После некоторого упрощения и добавления фильтрации ваш сценарий становится

import requests

APIkey = "..."  # My personal API access Key
line = "Red"  # Line will be testing with first
resp = requests.get(
    "https://api-v3.mbta.com/vehicles",
    params = {
        "filter[route]": line,
        # "api_key": APIkey,  # uncomment if you have an API key
    },
)
resp.raise_for_status()
MBTAV = resp.json()["data"]
vehicle_locals = {
    vehicle["id"]: vehicle["relationships"]["stop"]["data"]
    for vehicle in MBTAV
    if vehicle["relationships"]["stop"]["data"] is not None
}
print(vehicle_locals)

и результаты

{
    "R-547CC0EE": {"id": "70094", "type": "stop"},
    "R-547CC0E0": {"id": "70088", "type": "stop"},
    "R-547CC0D8": {"id": "70089", "type": "stop"},
    "R-547CBFEF": {"id": "70077", "type": "stop"},
    "R-547CBFA0": {"id": "70071", "type": "stop"},
    "R-547CBF3F": {"id": "70064", "type": "stop"},
    "R-547CBD8D": {"id": "70065", "type": "stop"},
    "R-547C9415": {"id": "70072", "type": "stop"},
    "R-547C5517": {"id": "70078", "type": "stop"},
}

(У меня нет вашего модуля APIstops и, следовательно, вашей функции stop_name(), поэтому она исключена отсюда.)

Другие вопросы по теме

Похожие вопросы