Чтение json-файла из API, получение ошибки “AttributeError: у объекта ‘Response’ нет атрибута ‘data'”

Вопрос или проблема

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

'AttributeError: 'Response' object has no attribute 'data'

Я не понимаю, почему, так как большинство (не все) моих однокурсников не получают эту ошибку.

Код, который я пытаюсь выполнить:

[1] import folium
[2] import geopandas as gpd
[3] import pandas as pd
[4] import numpy as np
[5] import urllib3
[6] import requests
[7] import json
[8] import os

[9] dmi_api = 'f8654190-89bb-43d2-9e08-416346b79e7b'
[10] url="https://dmigw.govcloud.dk/v2/metObs/collections/observation/itemsstationId=06031&parameterId=temp_dry&datetime=2021-01-01T00:00:00Z/2021-03-01T00:00:00Z&api-key="+str(dmi_api)
[11] r = requests.get(url)
[12] print(r)
[13] print(url)

[14] data = json.loads(r.data.decode('utf-8')) #Это то место, на которое ссылается ошибка (что приводит обратно к строке 11)
[15] data

Что я не понимаю, так это почему json.loads не работает, так как ссылка, очевидно, полна данных.

Я программирую на Python 3.2, используя Jupyter Notebook, доступный через Anaconda, если это поможет.

Это не вопрос по науке о данных, и вам следует попробовать программирование на stack-exchange вместо этого. Но это происходит из-за несовпадения API в Python, а именно типа метода GET объекта requests. Возможно, код, который вы получили, взят из версии, которая не является python 3.2, или модуля requests, который не обновлен. Я бы попробовал установить совместимую версию модуля requests из PyPI или сделать вашу версию Python совместимой с фрагментом кода.

Ответ или решение

Ошибка, с которой вы столкнулись — AttributeError: 'Response' object has no attribute 'data', указывает на то, что вы пытаетесь получить доступ к атрибуту data, которого не существует в объекте, возвращаемом библиотекой requests в Python.

Причины возникновения ошибки

В коде, представленном вами, вы выполняете HTTP-запрос и ожидаете, что объект ответа (r), возвращаемый методом requests.get(), будет иметь атрибут data. Однако библиотека requests не подразумевает наличие такого атрибута. Вместо этого, чтобы получить содержимое ответа в формате JSON, вам необходимо использовать метод .json() объекта ответа.

Исправление кода

Ваш текущий код:

data = json.loads(r.data.decode('utf-8'))  # Это вызывает ошибку

Вместо этого вам следует использовать:

data = r.json()  # Правильный способ извлечения JSON данных из ответа

Обновленный код должен выглядеть так:

import folium
import geopandas as gpd
import pandas as pd
import numpy as np
import urllib3
import requests
import json
import os

dmi_api = 'f8654190-89bb-43d2-9e08-416346b79e7b'
url = "https://dmigw.govcloud.dk/v2/metObs/collections/observation/itemsstationId=06031&parameterId=temp_dry&datetime=2021-01-01T00:00:00Z/2021-03-01T00:00:00Z&api-key=" + str(dmi_api)

r = requests.get(url)
print(r)
print(url)

# Используйте метод .json() вместо .data
data = r.json()
print(data)  # Выводим данные для проверки

Почему возникла проблема?

  1. Версия Python: Убедитесь, что вы используете актуальную версию библиотеки requests. Вы упомянули, что работаете с Python 3.2 — эта версия уже устарела и может не поддерживать функции, доступные в новейших версиях.

  2. Совместимость библиотек: Некоторые классы и методы, такие как r.json(), были усовершенствованы в более поздних версиях библиотеки.

Рекомендации

  • Обновите Python: Рекомендуется обновить вашу среду разработки до последней версии Python (например, Python 3.8 или выше), если это возможно, так как это обеспечит большую совместимость с библиотеками и инструментами.

  • Обновите библиотеку requests: Убедитесь, что у вас установлена последняя версия библиотеки requests. Вы можете обновить ее с помощью команды:

    pip install --upgrade requests
  • Проверка ответов от API: Всегда проверяйте код ответа от API перед обработкой данных, чтобы убедиться, что запрос прошел успешно. Например:

    if r.status_code == 200:
      data = r.json()
    else:
      print(f"Ошибка запроса: {r.status_code}")

Это обеспечит лучшую диагностику проблем и понимание того, что происходит с вашим API-запросом.

Следуя этим рекомендациям и исправлениям, вы сможете успешно получить и обработать данные JSON из API без ошибки.

Оцените материал
Добавить комментарий

Капча загружается...