#Что означает ошибка
UnicodeDecodeError
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xcf возникает, когда Python пытается прочитать как UTF-8 данные, записанные в другой кодировке. Для русскоязычных файлов это чаще всего Windows-1251 (cp1251) или кодировка консоли cp866. Байт 0xcf, например, — буква «П» в cp1251, но в UTF-8 такой последовательности быть не может.
В Windows функция open() без явной кодировки использует кодировку системы, в Linux и macOS обычно UTF-8, поэтому один и тот же код «работает» на одном компьютере и падает на другом. Правило простое: всегда указывайте encoding явно.
Укажите правильную кодировку при открытии файла.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Кодировка файлаcp1251. | Проявляется как «UnicodeDecodeError» или близкий по смыслу сбой. | Укажите. |
| BOMUTF-8-SIG. | Проявляется как «UnicodeDecodeError» или близкий по смыслу сбой. | Используйте. |
| Бинарный файлРежим. | Проявляется как «UnicodeDecodeError» или близкий по смыслу сбой. | rb. |
| КонсольWindows. | Проявляется как «UnicodeDecodeError» или близкий по смыслу сбой. | chcp. |
#Пошаговое решение
- Узнайте происхождение и реальную кодировку файлаНайдите в трассировке
UnicodeDecodeErrorназвание кодека (utf-8), номер байта и место чтения файла. Сначала сделайте копию исходного файла. Узнайте, из какой программы он получен: русские старые CSV нередко используют Windows-1251, некоторые выгрузки Excel — UTF-8 с BOM. Не определяйте кодировку исключительно по расширению или случайному результату автоматического распознавания; если источник неизвестен, проверьте небольшой фрагмент в редакторе с выбором кодировки. - Укажите кодировку в том месте, где читаете данныеДля обычного текста используйте
with open("data.txt", "r", encoding="utf-8-sig") as f: text = f.read()для UTF-8 с возможной меткой BOM. Если проверено, что исходник в Windows-1251, замените аргумент наencoding="cp1251". Путьdata.txtдолжен соответствовать вашему файлу; запускайте код из каталога проекта. Не переписывайте исходник в другой кодировке, пока не убедитесь, что все символы читаются корректно. - Для pandas проверьте кодировку отдельно от разделителяВ коде с pandas прочитайте
pd.read_csv("data.csv", encoding="cp1251", sep=";"), если по документации источника CSV действительно использует Windows-1251 и точку с запятой. При UTF-8 используйтеencoding="utf-8-sig"; разделитель может быть и запятой. Сравните несколько русских строк и число столбцов с оригиналом. Случайная замена кодировки может устранить исключение, но испортить символы. - Не скрывайте потерю символов режимом ignoreЕсли встречаются повреждённые байты, не ставьте
errors="ignore"как постоянное решение: часть текста бесследно исчезнет. Для диагностического просмотра допустимоerrors="replace", но сохраните исходные байты и найдите некорректное место; для бинарного файла нужен режимrbи правильный декодер формата. После исправления прочитайте весь файл, проверьте русские символы, переносы строк и отсутствие новых ошибок на других файлах.
#Как определить кодировку
Откройте файл в редакторе, умеющем показывать кодировку (VS Code, Notepad++). Если текст читается в Windows-1251 — используйте её. Для неизвестных файлов подойдёт библиотека chardet или charset-normalizer, хотя автоопределение вероятностное и может ошибаться на коротких файлах.
#Как исправить в коде
Передавайте кодировку: open(path, encoding="cp1251"). Для файлов, которые могут содержать BOM, используйте utf-8-sig. Если часть байтов повреждена, можно задать errors="replace" или errors="ignore", но это скрывает проблемы: подходит лишь для некритичных данных. Для CSV из Excel часто нужна кодировка cp1251 или utf-8-sig.
#Вывод в консоль и файлы
Ошибка может возникать и при записи в консоль Windows (UnicodeEncodeError). Установите переменную PYTHONUTF8=1 или запускайте с флагом -X utf8. Для сохранения результата всегда указывайте encoding="utf-8", чтобы файл одинаково открывался на любой системе.
with open("data.csv", encoding="cp1251", newline="") as f: text = f.read()