Email: office@yourdomain.com
Phone:: +44 20 7240 9319
back to top

Blog

UTF-8 и UnicodeDecodeError

Берем какой-нибудь файл c utf-8, открываем в режиме чтения, читаем, получаем UnicodeDecodeError.

import codecs # Для Py2. В Py3 codecs не используется. 

with codecs.open('file', 'r', encoding='utf8') as f:
    data = f.read()

Если файл в utf-8 еще нет гарантий, что в нем только utf-8 и никто не вставил, например koi8-r. Любые непонятные символы будут восприняты за ValueError.

Все дело в аргументах, которые передаются методу open(). Один из аргументов называется errors и значение у него по умолчанию strict. Этот параметр и вызывает исключение если видит в файле что-то не UTF-8. Вот пример с параметром replace, когда исключения вызываться не будут, а все непонятные символы будут изменены на '?' или '\ufffd'.

import codecs # Для Py2. В Py3 codecs не используется. 

with codecs.open('file', 'r', encoding='utf8', errors='replace') as f:
    data = f.read()

Можно передавать и другие параметры, например ignore – тогда непонятые символы будут исключены. Подробнее для Python2 и Python3.