#python #json #python-3.x
#python #json #python-3.x
Вопрос:
Я пытаюсь извлечь некоторые данные из API и поместить их в базу данных, но я столкнулся с некоторыми проблемами.
Данные из вышеуказанного URL
[
{"country":"Poland","country_code":"PL","last_updated":"2020-11-02T00:01:00.000Z","new_deaths":92,"new_infections":15578,"new_recovered":7818},
{"country":"Poland","country_code":"PL","last_updated":"2020-11-03T00:02:00.000Z","new_deaths":227,"new_infections":19364,"new_recovered":5573},
{"country":"Poland","country_code":"PL","last_updated":"2020-11-04T00:00:00.000Z","new_deaths":373,"new_infections":24692,"new_recovered":8974},
{"country":"Poland","country_code":"PL","last_updated":"2020-11-05T00:11:00.000Z","new_deaths":367,"new_infections":27143,"new_recovered":8721}
]
Ошибка
Date = i[‘last_updated’] Ошибка типа: строковые индексы должны быть целыми числами
Часть моего кода
try:
response = http.request('GET', url)
data = json.loads(response.data.decode('utf-8'))
index = 0
for i in data:
Date = None
Confirmed = None
Deaths = None
Recovered = None
#Active = None
Date = i['last_updated']
Confirmed = i['new_infections']
Deaths = i['new_deaths']
Recovered = i['new_recovered']
#Active = i['Active']
cur.execute("""
INSERT INTO covid_stats_poland
VALUES (%s, %s, %s, %s, %s);
""",
(index, Date, Confirmed, Deaths, Recovered))
conn.commit()
index = 1
cur.close()
Может кто-нибудь, пожалуйста, объяснить, что я делаю не так / как я могу это исправить?
Ответ №1:
Ошибка, скорее всего, связана data
с дополнительной информацией HTTP, такой как заголовки. См. Ниже Два стандартных подхода для извлечения JSON.
Вариант 1: urllib.request
import json
import urllib.request
URL = "https://api.coronatracker.com/v4/analytics/newcases/country?countryCode=PLamp;startDate=2020-11-01amp;endDate=2020-11-06"
with urllib.request.urlopen(URL) as url:
data = json.loads(url.read().decode())
print(data)
for i in data:
Date = i['last_updated']
Confirmed = i['new_infections']
Deaths = i['new_deaths']
Recovered = i['new_recovered']
print(f"nDate: {Date}")
print(f"Confirmed: {Confirmed}")
print(f"Deaths: {Deaths}")
print(f"Recovered: {Recovered}")
Вывод
[{'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-02T00:01:00.000Z', 'new_deaths': 92, 'new_infections': 15578, 'new_recovered': 7818}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-03T00:02:00.000Z', 'new_deaths': 227, 'new_infections': 19364, 'new_recovered': 5573}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-04T00:00:00.000Z', 'new_deaths': 373, 'new_infections': 24692, 'new_recovered': 8974}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-05T00:11:00.000Z', 'new_deaths': 367, 'new_infections': 27143, 'new_recovered': 8721}]
Date: 2020-11-02T00:01:00.000Z
Confirmed: 15578
Deaths: 92
Recovered: 7818
Date: 2020-11-03T00:02:00.000Z
Confirmed: 19364
Deaths: 227
Recovered: 5573
Date: 2020-11-04T00:00:00.000Z
Confirmed: 24692
Deaths: 373
Recovered: 8974
Date: 2020-11-05T00:11:00.000Z
Confirmed: 27143
Deaths: 367
Recovered: 8721
Вариант 2: http
модуль (менее распространенный)
import http
import json
URL = "api.coronatracker.com"
url_path = "/v4/analytics/newcases/country?countryCode=PLamp;startDate=2020-11-01amp;endDate=2020-11-06"
conn = http.client.HTTPSConnection(URL)
conn.request("GET", url_path)
response = conn.getresponse()
data = json.loads(response.read().decode())
print(data)
for i in data:
Date = i['last_updated']
Confirmed = i['new_infections']
Deaths = i['new_deaths']
Recovered = i['new_recovered']
print(f"nDate: {Date}")
print(f"Confirmed: {Confirmed}")
print(f"Deaths: {Deaths}")
print(f"Recovered: {Recovered}")
Вывод
[{'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-02T00:01:00.000Z', 'new_deaths': 92, 'new_infections': 15578, 'new_recovered': 7818}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-03T00:02:00.000Z', 'new_deaths': 227, 'new_infections': 19364, 'new_recovered': 5573}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-04T00:00:00.000Z', 'new_deaths': 373, 'new_infections': 24692, 'new_recovered': 8974}, {'country': 'Poland', 'country_code': 'PL', 'last_updated': '2020-11-05T00:11:00.000Z', 'new_deaths': 367, 'new_infections': 27143, 'new_recovered': 8721}]
Date: 2020-11-02T00:01:00.000Z
Confirmed: 15578
Deaths: 92
Recovered: 7818
Date: 2020-11-03T00:02:00.000Z
Confirmed: 19364
Deaths: 227
Recovered: 5573
Date: 2020-11-04T00:00:00.000Z
Confirmed: 24692
Deaths: 373
Recovered: 8974
Date: 2020-11-05T00:11:00.000Z
Confirmed: 27143
Deaths: 367
Recovered: 8721
Комментарии:
1.Спасибо, Кристофер, работает как шарм. Также отформатировал дату сейчас
Date = i['last_updated']
Date = datetime.strptime(Date, "%Y-%m-%dT%H:%M:%S.%f%z")
Date = Date.strftime("%Y/%m/%d")