Окончательное решение проблемы тарабарщины Python (TL; DR)

Python

Окончательное решение проблемы тарабарщины Python (TL; DR)

Есть особенно интересное явление: когда у нас болит голова от программирования на питоне, почти все статьи, которые мы ищем, будут первыми, кто будет жаловаться. Потом беспомощно писать решения (решения не решения). Эта проблема действительно не проблема новичка, даже у ветеранов Python с десятком лет часто болит голова. Китай и зарубежные страны одинаковы. Проверьте этого эксперта по Python наОбъясните искаженное получасовое видео с Конгресса PyConЯ узнал, он все дал ему обратно в кодирование, Dizu, eNcoding, Decoding, и на этапе он отказался отвечать, и можно представить себе всю сложность этой проблемы.

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

С ворчанием покончено, вот заметки из блокнота ipython, которые я в очередной раз потратил целых два дня на тестирование и доработку.ipynb

unicodebytes

type(字符串)strbytes
utf-8gb2312

encodingdecoding


unicodebytesencoding
bytesunicodedecoding




UnicodeDecodeError: 'ascii' codec can't decode

显性

显性

utf-8



response.textresponse.content

decoding

response.textISO8859

decoding

unicode(b'你好‘)
b'你好'.decode('utf-8')

unicode()декодировать, вместо того, чтобы использовать.decode('utf-8'), ибо явно декодировать имя не получится, если исходник действительно (скорее всего так и есть)ISO8859и т. д., то неправильное декодирование обязательно приведет к искажению символов или прямой ошибке программы. Запомнить!

Так что только здесьunicode()расшифровка. Например:

Резюме этого этапа: обязательно помните, что весь текст используется единообразноstrстрока формата

Просто следите за связанными сетевыми операциями, такими как запросы, пока вы контролируете строки из внешних источников, унифицированных какstr, в остальном хорошо сказано!

Ниже приведен полный тест от получения сетевых ресурсов (включая китайские веб-страницы, которые считаются кодированными по ISO8850 по запросам) до локальных операций и сохранения в локальные файлы.

import requests

r = requests.get('http://pycoders-weekly-chinese.readthedocs.io/en/latest/issue5/unipain.html')

# write a webpage to local file
with open('test.html', 'w') as f:
    f.write( r.content )

# read from a local html file
with open('test.html', 'r') as f:
    ss = f.read()

Готово! Эффект следующий:

Больше никакой возни, проверки каждой переменной и написания кучи вложенных преобразований!