Frage

Ich möchte die Informationen manipulieren DAS URL.Ich kann es erfolgreich öffnen und seinen Inhalt lesen.Aber was ich wirklich tun möchte, ist, all die Dinge wegzuwerfen, die ich nicht will, und die Dinge zu manipulieren, die ich behalten möchte.

Gibt es eine Möglichkeit, die Zeichenfolge in ein Diktat umzuwandeln, damit ich darüber iterieren kann?Oder muss ich es einfach so analysieren, wie es ist (Str-Typ)?

from urllib.request import urlopen

url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)

print(response.read()) # returns string with info
War es hilfreich?

Lösung

Als ich gedruckt habe response.read() Ich bemerkte, dass b wurde der Zeichenfolge vorangestellt (z. B. b'{"a":1,..).Das „b“ steht für Bytes und dient als Deklaration für den Typ des Objekts, das Sie bearbeiten.Seitdem wusste ich, dass eine Zeichenfolge mithilfe von in ein Diktat umgewandelt werden kann json.loads('string'), ich musste nur den Byte-Typ in einen String-Typ konvertieren.Ich habe dies getan, indem ich die Antwort in utf-8 dekodiert habe decode('utf-8').Sobald es sich um einen String-Typ handelte, war mein Problem gelöst und ich konnte problemlos darüber iterieren dict.

Ich weiß nicht, ob dies die schnellste oder „pythonischste“ Art ist, dies zu schreiben, aber es funktioniert und es gibt immer noch Zeit für Optimierung und Verbesserung!Vollständiger Code für meine Lösung:

from urllib.request import urlopen
import json

# Get the dataset
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = urlopen(url)

# Convert bytes to string type and string type to dict
string = response.read().decode('utf-8')
json_obj = json.loads(string)

print(json_obj['source_name']) # prints the string with 'source_name' key

Andere Tipps

Sie können stattdessen auch die Anforderungsbibliothek von Python verwenden.

generasacodicetagpre.

Jetzt können Sie den "Dict" wie ein Python-Wörterbuch manipulieren.

json funktioniert mit Unicode-Text in Python 3 (das JSON-Format selbst ist nur in Bezug auf Unicode-Text definiert) und daher müssen Sie in der HTTP-Antwort empfangene Bytes dekodieren. r.headers.get_content_charset('utf-8') Erhält die Zeichenkodierung:

#!/usr/bin/env python3
import io
import json
from urllib.request import urlopen

with urlopen('https://httpbin.org/get') as r, \
     io.TextIOWrapper(r, encoding=r.headers.get_content_charset('utf-8')) as file:
    result = json.load(file)
print(result['headers']['User-Agent'])

Es ist nicht notwendig, es zu verwenden io.TextIOWrapper Hier:

#!/usr/bin/env python3
import json
from urllib.request import urlopen

with urlopen('https://httpbin.org/get') as r:
    result = json.loads(r.read().decode(r.headers.get_content_charset('utf-8')))
print(result['headers']['User-Agent'])

Ich denke, die Dinge haben sich in Python 3.4 geändert.Das hat für mich funktioniert:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top