Вопрос

Я хочу манипулировать информацией в этот URL-адрес.Я могу успешно открыть его и прочитать его содержимое.Но что я действительно хочу сделать, так это выбросить все то, что мне не нужно, и манипулировать тем, что я хочу сохранить.

Есть ли способ преобразовать строку в dict, чтобы я мог перебирать ее?Или мне просто нужно разобрать его как есть (тип 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
Это было полезно?

Решение

Когда я напечатал response.read() Я заметил, что b был предварительно добавлен к строке (например b'{"a":1,..).Буква "b" обозначает байты и служит объявлением типа объекта, с которым вы работаете.Поскольку я знал, что строка может быть преобразована в dict с помощью json.loads('string'), мне просто нужно было преобразовать тип byte в тип string.Я сделал это, расшифровав ответ в utf-8 decode('utf-8').Как только это было в строковом типе, моя проблема была решена, и я легко смог выполнить итерацию по dict.

Я не знаю, является ли это самым быстрым или наиболее "питоническим" способом написания этого, но он работает, и всегда есть время для оптимизации и улучшения позже!Полный код для моего решения:

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

Другие советы

Вы также можете использовать вместо этого библиотеку запросов Python.

import requests

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

Теперь вы можете манипулировать «Dict», как словарь Python.

json работает с текстом Unicode в Python 3 (сам формат JSON определяется только с точки зрения текста Unicode), и поэтому вам необходимо декодировать байты, полученные в HTTP-ответе. r.headers.get_content_charset('utf-8') получает ваш символ кодировки:

#!/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'])
.

Не нужно использовать io.TextIOWrapper здесь:

#!/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'])
.

Я предполагаю, что все изменилось в Python 3.4.Это работало для меня:

print("resp:" + json.dumps(resp.json()))
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top