Python WindowsLinuxmacOSPython 3

Python: Python выдаёт UnicodeDecodeError при чтении CSV

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

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

При чтении CSV UnicodeDecodeError возникает, когда байты файла не соответствуют выбранной текстовой кодировке: csv.reader разбирает уже декодированный текст и сам кодировку не определяет.

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

#Что произошло и когда проявляется ошибка

При чтении CSV UnicodeDecodeError возникает, когда байты файла не соответствуют выбранной текстовой кодировке: csv.reader разбирает уже декодированный текст и сам кодировку не определяет.

#Причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
Файл не в UTF-8Исходная CSV может быть сохранена в cp1251 или иной кодировке.Ошибка utf-8 codec can't decode byte на конкретном байтеПодтвердить кодировку из источника, передать encoding=.
CSV содержит метку BOMНекоторые программы добавляют UTF-8 BOM.В названии первой колонки виден символ Использовать utf-8-sig для файлов такого формата.
Файл повреждён или смешивает кодировкиКодировка может меняться внутри файла или содержать испорченные байты.Часть строк читается, часть выдаёт ошибкуПроверить исходный экспорт, не скрывать ошибки ignore.

#Подробная пошаговая диагностика и исправление

  1. 1. Сохраните CSV в копию и установите источникПереименуйте копию, например data-copy.csv, не изменяя оригинал. Уточните, из какой программы выгружен файл и какая кодировка выбрана при экспорте. Если файл содержит персональные данные, не отправляйте его в публичные определители кодировки.
  1. 2. Прочитайте первые байты без декодированияВ новой временной программе inspect_csv.py подставьте путь к копии. Вывод b\xef\xbb\xbf в начале обычно означает UTF-8 с BOM; другие байты сами по себе не доказывают cp1251.
  2. Пример кода по теме
    Python
    Образец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
    from pathlib import Path
    p = Path("data-copy.csv")
    print(p.read_bytes()[:32])
  1. 3. Попробуйте правильный encoding и newlineДля UTF-8 с BOM откройте файл с utf-8-sig; для старой выгрузки Windows на русском языке можно пробовать cp1251, но только если источник подтвердил формат. newline="" нужен для корректной обработки переносов внутри ячеек.
  2. Пример кода по теме
    Python
    Образец кода для файла .py в тестовой копии проекта; перед внедрением замените имена файлов на реальные.
    import csv
    with open("data-copy.csv", "r", encoding="utf-8-sig", newline="") as f:
        reader = csv.reader(f, delimiter=";")
        for row in reader:
            print(row[:3])
  1. 4. Проверьте разделитель и сохранность кириллицыЕсли вместо нескольких столбцов получается один, посмотрите реальный разделитель в файле (запятая, точка с запятой, табуляция) и измените delimiter. Убедитесь, что русские буквы отображаются без «кракозябр», а число строк соответствует выгрузке. Не используйте errors="ignore" для тихой потери байтов.
  1. 5. Переэкспортируйте при смешанной кодировкеЕсли ошибка появляется в середине файла при всех подтверждённых вариантах, откройте исходную таблицу в программе-источнике и экспортируйте заново в CSV UTF-8. Для больших и критичных файлов сравните количество строк и выборочные значения до замены оригинала.

#Как проверить, что проблема устранена

CSV читается полностью с правильной кириллицей, нужным разделителем и ожидаемым количеством записей.

#Если исправление не помогло

Если файл распознаётся как двоичный формат Excel .xlsx, читайте его подходящим инструментом, а не через csv.reader. Если исходные байты повреждены, восстановите выгрузку у источника.

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

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