#python #json #python-3.x #rest #api
#python #json #python-3.x #остальное #API
Вопрос:
Итак, я извлекаю данные в JSON из API, в котором есть dicts и несколько списков.
result=r.json()
i=0
x=0
for row in r:
print('Driver ID: ', result['logs'][x]['log']['driver']['username'])
print('First Name: ', result['logs'][x]['log']['driver']['first_name'])
print('Last Name: ', result['logs'][x]['log']['driver']['last_name'])
for row1 in r:
print('ID: ', result['logs'][x]['log']['events'][i]['event']['id'])
print('Start Time: ', result['logs'][x]['log']['events'][i]['event']['start_time'])
print('Type: ', result['logs'][x]['log']['events'][i]['event']['type'])
print('Location: ', result['logs'][x]['log']['events'][i]['event']['location'])
i=i 1
x=x 1
Ошибка, которую я получаю, заключается в
print('ID: ', result['logs'][x]['log']['events'][i]['event']['id'])
IndexError: list index out of range
Я понимаю, что переменная i суммируется до точки, где нет объекта с этим индексом, проблема в том, что ключ ‘events’ имеет переменное количество событий в каждом списке. Например, журнал для первого драйвера может содержать 7 событий, а у следующего драйвера может быть только 3 события. Есть ли способ, которым я могу запустить цикл на основе количества индексов, которые существуют в событиях?
Я также пытался использовать цикл с ‘result’ вместо ‘r’, но я довольно новичок в Python, и результаты, которые я получал с этим, были неверными.
Вот ссылка на документ API. Конечная точка, на которую я ориентируюсь, — это / logs. https://developer.keeptruckin.com/reference#get-logs
Комментарии:
1. В подобных случаях я бы использовал инструмент, который распаковывает json, чтобы сначала показать мне структуру данных. Взгляните на json_normalize из Pandas.
Ответ №1:
Вы должны выполнять итерации по вложенным спискам вместо result
dict на корневом уровне и избегать использования индексов:
result = r.json()
for log in result['logs']:
print('Driver ID: ', log['log']['driver']['username'])
print('First Name: ', log['log']['driver']['first_name'])
print('Last Name: ', log['log']['driver']['last_name'])
for event in log['log']['events']:
print('ID: ', event['event']['id'])
print('Start Time: ', event['event']['start_time'])
print('Type: ', event['event']['type'])
print('Location: ', event['event']['location'])