Как перевести файл json в текст

Обновлено: 06.07.2024

trapwalker

Не надо там ничего энкодить и декодить.
В ответе текст в юникоде и парсится функцией `json.loads` адекватно.
Проблема скорее всего у вас из-за кодировки в консоли винды. там какая-нибудь однобайтовая кодировка вроде cp1251 или cp866.
При попытке напечатать юникод в этом терминале вы получаете ошибку из-за того, что при автоматическом преобразовании из юникода в кодировку консоли питон пытается взять кодек по умолчанию, который, конечно 'ascii'.

Винда такая винда со своим беспощадным терминалом и кодировками по умолчанию.

Но вы можете напечатать этот текст, в нём нет непечатных символов для однобайтовой кодировки. Попробуйте так:

Общие правила работы с кодировками такие:
- на входе в программу мы всё преобразовываем в юникод.
- на выходе всё кодируем в нужную кодировку.
- если выход - это печать в стандартный вывод (stdout), то ситуаций может быть 4:
1) печатаем в терминал винды и терминал у нас в кодировке 1251
2) печатаем в терминал и он у нас в 866 кодировке
3) печатаем в stdout, который перенаправлен в файл и пайп не знает в какой он кодировке, то есть кодировка не задана и мы можем заэнкодить в любую и в файл это запишется. Пользутейс utf8 - самая правильная кодировка для всего.
4) вы в линуксе и терминал у вас в кодировке по умолчанию - utf8 и всё хорошо.

В любом случае, печатая или сохраняя что-то в файл вы должны понимать, что текст нужно закодировать в кодировку. Это может произойти неявно (как в ашем случае) но при попытке закодировать в кодировку по умолчанию (ascii) не каждый символ в ней можно представить. В ASCII всего 127 символов. Получилась закономерная ошибка.

У потоков стандартного ввода/вывода есть атрибут encoding:

В вашем случае будет либо None, если вывод перенаправлен в файл,
либо 'cp1251', либо 'cp866' ну или ещё что-нибудь эдакое.
Если не None, то в эту кодировку можно постараться заэнкодить вашу строку. По-прежнему некоторые символы могут не конвертнуться (не в вашем случае), их можно игнорировать специальным аргументом метода encode.

Читайте также: