Question

Je veux manipuler l'information à CETTE url.Je peux réussir à l'ouvrir et de lire son contenu.Mais ce que je veux vraiment faire est de jeter toutes les choses que je ne veux pas, et de manipuler les choses que je veux garder.

Est-il un moyen de convertir la chaîne en un dict afin que je puisse effectuer une itération sur elle?Ou dois-je l'analyser comme il est (str type)?

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
Était-ce utile?

La solution

Lorsque j'ai imprimé response.read() J'ai remarqué que b a preprended à la chaîne (par ex. b'{"a":1,..).Le "b" signifie pour les octets et sert une déclaration pour le type de l'objet que vous manipulez.Depuis, j'ai su qu'une chaîne de caractères peut être convertie en un dict en utilisant json.loads('string'), J'avais juste à convertir l'octet de type pour un type de chaîne.Je l'ai fait par le décodage de la réponse de l'utf-8 decode('utf-8').Une fois qu'il était dans une chaîne de caractères de type mon problème a été résolu et j'ai été capable d'effectuer une itération sur les dict.

Je ne sais pas si c'est le plus rapide ou le plus "pythonic' façon d'écrire cela, mais il fonctionne et il ya toujours temps plus tard de l'optimisation et de l'amélioration de la!Le code complet de 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

Autres conseils

Vous pouvez également utiliser la bibliothèque de demandes 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 en Python 3 (format JSON elle-même est définie seulement en termes de texte Unicode) et, par conséquent, vous avez besoin de décoder les octets reçus dans la réponse HTTP. r.headers.get_content_charset('utf-8') de votre le codage des 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()))

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top