Je veux manipuler l'information à THIS url. Je peux avec succès l'ouvrir et lire son contenu. Mais ce que je veux vraiment faire, c'est jeter tout ce que je ne veux pas et manipuler ce que je veux garder.
Existe-t-il un moyen de convertir la chaîne en dict afin de pouvoir l'itérer? Ou dois-je simplement l'analyser tel quel (type str)?
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
Cela a été résolu.
Lorsque j’ai imprimé response.read()
, j’ai remarqué que b
était ajouté à la chaîne (par exemple b'{"a":1,..
). Le "b" représente les octets et sert de déclaration pour le type d'objet que vous manipulez. Depuis, je savais qu'une chaîne pouvait être convertie en dict en utilisant json.loads('string')
, il me suffisait de convertir le type d'octet en un type de chaîne. Je l'ai fait en décodant la réponse à utf-8 decode('utf-8')
. Une fois que c’était dans un type string, mon problème était résolu et j’étais capable d’itérer facilement une itération sur dict
.
Je ne sais pas si c'est la manière la plus rapide ou la plus 'pythonique' d'écrire cela, mais cela fonctionne et il y a toujours du temps après optimisation et amélioration! Code complet pour ma solution:
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
Si quelqu'un découvre cela via Google, j'espère que cela aidera. Le meilleur conseil que je puisse vous donner est de lire attentivement vos erreurs et de porter une attention particulière au résultat que vous recevez.
Vous pouvez également utiliser la bibliothèque de requêtes de python à la place.
import requests
url = 'http://www.quandl.com/api/v1/datasets/FRED/GDP.json'
response = requests.get(url)
dict = response.json()
Maintenant, vous pouvez manipuler le "dict" comme un dictionnaire python.
json
fonctionne avec le texte Unicode dans Python 3 (le format JSON lui-même n’est défini qu’en termes de texte Unicode) et vous devez donc décoder les octets reçus dans la réponse HTTP. r.headers.get_content_charset('utf-8')
récupère votre encodage de caractères:
#!/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'])
Il n'est pas nécessaire d'utiliser io.TextIOWrapper
ici:
#!/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'])
Je suppose que les choses ont changé dans Python 3.4. Cela a fonctionné pour moi:
print("resp:" + json.dumps(resp.json()))