UnicodeDecodeError при открытии файла — как читать файл в нужной кодировке?
Открываю текстовый файл с русскими буквами, а получаю UnicodeDecodeError: 'utf-8' codec can't decode byte .... Файл открывается в блокноте нормально! Почему Python не может его прочитать и как указать кодировку?
2 ответа
UnicodeDecodeError значит: Python пытается прочитать файл в одной кодировке, а он сохранён в другой. Байты не складываются в корректные символы — отсюда ошибка. Чаще всего файл в кодировке Windows (cp1251), а Python по умолчанию (или вы сами) читает как utf-8.
Ошибка:
with open("text.txt", encoding="utf-8") as f:
data = f.read() # UnicodeDecodeError, если файл в cp1251
Исправление — указать правильную кодировку:
with open("text.txt", encoding="cp1251") as f:
data = f.read()
Что делать пошагово:
- Всегда явно указывайте
encodingпри открытии текстовых файлов — не полагайтесь на умолчание ОС. - Если не знаете кодировку — попробуйте по очереди
utf-8,cp1251,utf-8-sig(последняя убирает BOM в начале файла). - Если файл нужно просто скопировать/обработать как есть и кодировка неизвестна — откройте в бинарном режиме
open(path, "rb")и работайте с байтами.
Лучшая профилактика — пересохранить файл в UTF-8 (в редакторе «Сохранить как → UTF-8») и дальше везде использовать encoding="utf-8".
Если строго нужно прочитать «через силу» и потеря отдельных символов не критична, можно добавить errors="replace" или errors="ignore":
open("text.txt", encoding="utf-8", errors="replace")
Но это лечит симптом, а не причину. Правильнее узнать настоящую кодировку файла и указать её.