Seite 1 von 1

openweathermap json lesen

Verfasst: Sonntag 21. Juni 2015, 12:57
von Hi2Helmi
Hallo,
ich bin noch Neuling, was Python angeht und habe schon viel getestet.
Jetzt habe ich allerdings ein kleines Problem, mit dem ich nicht klar komme.

Ich möchte gerne die Daten aus dem JSON von OpenWeatherMap auslesen und hänge schon am Anfang.

Code: Alles auswählen

from urllib.request import urlopen
import json

json_string = urlopen("http://api.openweathermap.org/data/2.5/weather?id=6556947&units=metric&lang=de").read()

test=json.loads(json_string)
print(test['coord']['lon'])
Und zack bekomme ich einen Fehler ausgegeben, mit dem ich nicht viel anfangen kann.

Code: Alles auswählen

Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Traceback (most recent call last):
  File "D:\Cloud\Cloud Station FH\Raspi\Python\MeinWetter\jsontest.py", line 6, in <module>
    test=json.loads(json_string)
  File "C:\Python34\lib\json\__init__.py", line 312, in loads
    s.__class__.__name__))
TypeError: the JSON object must be str, not 'bytes'
>>> 
Mit der Beschreibung in der Hilfe kann ich nicht viel anfangen, da mein Englisch zu schlecht ist.
Deshalb Frage ich die Profis hier einmal.

Hi2Helmi

Re: openweatermap json lesen

Verfasst: Sonntag 21. Juni 2015, 13:24
von BlackJack
@Hi2Helmi: `json_string` ist vom Typ `bytes`, müsste aber damit der Wert von `json.loads()` verarbeitet werden kann vom Typ `str` sein. Du müsstest die Bytes also vorher zu einer Zeichenkette dekodieren mit der entsprechenden Methode auf dem `bytes`-Exemplar und der Angabe der Kodierung die verwendet werden soll. Bei JSON ist das in der Regel UTF-8.

Re: openweatermap json lesen

Verfasst: Sonntag 21. Juni 2015, 13:25
von Sirius3
@Hi2Helmi: der Fehler sagt Dir, dass json.loads einen Unicode-String erwartet, HTTPResponse.read aber nur Bytes liefert. Um zwischen Bytes und Strings zu konvertieren braucht man ein Encoding, das sagt, wie man Bytes in Zeichen umwandeln muß. Dieses Encoding wird normalerweise vom Server mitgeliefert und steht im Header im Content-Type. Da das Auslesen und interpretieren recht aufwändig ist, gibt es schon fertige Pakete, die das für einen erledigen. Hier sei "requests" empfohlen, das auch gleich die json-Ausgabe liefert:

Code: Alles auswählen

import requests

response = requests.get("http://api.openweathermap.org/data/2.5/weather", params={"id":6556947, "units":"metric", "lang":"de"})

weather = response.json()
print(weather['coord']['lon'])

Re: openweatermap json lesen

Verfasst: Sonntag 21. Juni 2015, 18:15
von Hi2Helmi
Vielen Dank,

das mit dem "requests" hatte ich auch irgendwo gelesen, konnte mir aber keinen Reim drauf machen und habe es nicht probiert.

Und jetzt habe ich das Problem, dass requests nicht installiert ist, oder nicht gefunden wird.

Code: Alles auswählen

Traceback (most recent call last):
  File "D:\Cloud\Cloud Station FH\Raspi\Python\MeinWetter\jsontest.py", line 3, in <module>
    import requests
ImportError: No module named 'requests'
Hi2Helmi

Re: openweathermap json lesen

Verfasst: Sonntag 21. Juni 2015, 18:30
von Sirius3
@Hi2Helmi: ja, request muß extra installiert werden.

Re: openweathermap json lesen

Verfasst: Sonntag 21. Juni 2015, 19:24
von Hi2Helmi
Ich habe jetzt requests mit:

Code: Alles auswählen

py -3.4 -m pip install requests
installiert und es funktioniert.
Danke für die Hilfe jetzt kann ich endlich weiter machen.