Python LinuxWindowsmacOS

Python: UnicodeDecodeError — can't decode byte в UTF-8

  • Обновлено
  • Чтение ≈ 3 минуты

Краткий ответ

Укажите правильную кодировку при открытии файла.

В этой статье
  1. Что означает ошибка
  2. Причины и решения
  3. Пошаговое решение
  4. Как определить кодировку
  5. Как исправить в коде
  6. Вывод в консоль и файлы

#Что означает ошибка

Сообщение
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.

#Пошаговое решение

  1. Узнайте происхождение и реальную кодировку файлаНайдите в трассировке UnicodeDecodeError название кодека (utf-8), номер байта и место чтения файла. Сначала сделайте копию исходного файла. Узнайте, из какой программы он получен: русские старые CSV нередко используют Windows-1251, некоторые выгрузки Excel — UTF-8 с BOM. Не определяйте кодировку исключительно по расширению или случайному результату автоматического распознавания; если источник неизвестен, проверьте небольшой фрагмент в редакторе с выбором кодировки.
  2. Укажите кодировку в том месте, где читаете данныеДля обычного текста используйте with open("data.txt", "r", encoding="utf-8-sig") as f: text = f.read() для UTF-8 с возможной меткой BOM. Если проверено, что исходник в Windows-1251, замените аргумент на encoding="cp1251". Путь data.txt должен соответствовать вашему файлу; запускайте код из каталога проекта. Не переписывайте исходник в другой кодировке, пока не убедитесь, что все символы читаются корректно.
  3. Для pandas проверьте кодировку отдельно от разделителяВ коде с pandas прочитайте pd.read_csv("data.csv", encoding="cp1251", sep=";"), если по документации источника CSV действительно использует Windows-1251 и точку с запятой. При UTF-8 используйте encoding="utf-8-sig"; разделитель может быть и запятой. Сравните несколько русских строк и число столбцов с оригиналом. Случайная замена кодировки может устранить исключение, но испортить символы.
  4. Не скрывайте потерю символов режимом 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", чтобы файл одинаково открывался на любой системе.

PythonКоманда
Чтение файла в явно указанной кодировке.
with open("data.csv", encoding="cp1251", newline="") as f:
text = f.read()

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 1 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.