Я становлюсь действительно усталым от попытки выяснить, почему этот код работает в Python 2 а не в Python 3. Я просто пытаюсь захватить страницу json и затем проанализировать его. Вот код в Python 2:
import urllib, json
response = urllib.urlopen("http://reddit.com/.json")
content = response.read()
data = json.loads(content)
Я думал, что эквивалентный код в Python 3 будет этим:
import urllib.request, json
response = urllib.request.urlopen("http://reddit.com/.json")
content = response.read()
data = json.loads(content)
Но это аварийно завершается в моей поверхности, потому что данные, возвращенные чтением (), являются типом "байтов". Однако я не могу ни за что в жизни заставить это преобразовывать во что-то, что json сможет проанализировать. Я знаю от заголовков, что reddit пытается передать utf-8 обратно мне, но я, может казаться, не заставляю байты декодировать в utf-8:
import urllib.request, json
response = urllib.request.urlopen("http://reddit.com/.json")
content = response.read()
data = json.loads(content.decode("utf8"))
Что я делаю неправильно?
Править: проблема состоит в том, что я не могу получить данные в применимое состояние; даже при том, что json загружает данные, часть его является невизуализуемой, и я хочу смочь распечатать данные на экран.
Второе редактирование: проблема больше имеет отношение к печати, чем парсинг, это кажется. Ответ Alex позволяет, чтобы сценарий работал в Python 3 путем установки IO на utf8. Но вопрос все еще остается: почему случается так, что код работал в Python 2, но не Python 3?
Код, который вы публикуете, вероятно, связан с неправильными операциями вырезания и вставки, потому что он явно неверен в обеих версиях ( f.read ()
не работает, потому что нет ] f
начальное имя определено).
В Py3 у меня отлично работает ur = response.decode ('utf8')
, как и следующий json.loads (ur)
. Возможно, неправильные копии и вставки повлияли на ваши попытки преобразования 2 в 3.