Python LinuxWindowsmacOS

Python: UnicodeDecodeError при чтении CSV в неизвестной кодировке

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

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

UnicodeDecodeError при открытии CSV: безопасно установите источник и кодировку данных, отличите UTF-8 с BOM от Windows-1251 и задайте encoding явно без повреждения исходника.

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

#Что происходит и как распознать неисправность

При чтении CSV через open() или pandas Python сообщает UnicodeDecodeError, например что codec utf-8 не может декодировать байт. CSV — текстовый файл, но не имеет обязательной единой кодировки; ошибка сама по себе не доказывает Windows-1251.

#Как отличить причины

Возможная причинаКак узнатьЧто делать
Файл не в UTF-8CSV экспортирован старой программой в Windows-1251 или иной кодировке.После явного UTF-8 появляется UnicodeDecodeError на кириллице.Узнайте кодировку экспорта, затем задайте encoding.
Файл с меткой BOMНекоторые приложения сохраняют UTF-8 с BOM.Первое имя столбца начинается с невидимого символа U+FEFF, даже если чтение работает.Используйте utf-8-sig.
Смешанные или повреждённые данныеФайл содержит фрагменты разных кодировок или неверные байты.При любом согласованном варианте есть ошибки или нечитаемые символы.Получите новый экспорт; не теряйте данные через errors="ignore".

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

  1. Сохраните неизменённую копию CSVВ Проводнике Windows или файловом менеджере Linux/macOS найдите проблемный CSV, скопируйте его в отдельное место и работайте с копией. Если файл уже загружается в базу, остановите автоматический импорт до выяснения кодировки: ошибка декодирования не означает, что допустимо пропускать строки.
  2. Посмотрите полное сообщение и используемый способ чтенияОткройте проект в VS Code и найдите строку open(...), pd.read_csv(...) или обработчик загрузки. Запишите название кодека из ошибки (utf-8, cp1251 и др.) и номер позиции. Если программный код читает HTTP-ответ или архив, сначала убедитесь, что вы работаете с распакованным CSV, а не с бинарным файлом.
  3. Узнайте кодировку у источника экспортаОткройте программу, которая создала CSV, и проверьте её диалог «Экспорт»/«Сохранить как»: поддерживает ли она UTF-8, UTF-8 с BOM или ANSI/Windows-1251. Если файл отправил коллега, уточните кодировку. Не судите о кодировке только по расширению .csv или по первому успешному варианту.
  4. Проверьте UTF-8 и заголовкиВ редакторе создайте небольшой отдельный диагностический файл с csv.DictReader, укажите encoding="utf-8-sig" и newline="", запустите его через выбранный интерпретатор Python. Если выводит ожидаемые русские названия столбцов и значения, UTF-8 подтверждён для проверенного файла; при сбое перейдите к сведениям об исходной кодировке.
  5. Если подтверждена Windows-1251, укажите её явноДля CSV, сохранённого из старой Windows-программы в Windows-1251, замените только encoding="utf-8-sig" на encoding="cp1251". Прочитайте несколько строк и сравните фамилии, знаки валюты и названия городов с исходной программой. Если появились бессмысленные символы, верните UTF-8 и уточните формат; бездумный перебор может дать ложное «успешно».
  6. Учтите разделители и кавычки отдельно от кодировкиЕсли ошибок декодирования больше нет, но все столбцы слились, проверьте в исходном файле разделитель: запятая, ; или табуляция. Укажите delimiter=";" только для соответствующего CSV. Не заменяйте все запятые на точки с запятой: внутри значений могут быть разделители в кавычках.
  7. Повторите импорт на копии и зафиксируйте параметрыЗапустите чтение копии полностью, проверьте число строк, первый и последний столбец, несколько русских значений. Только после этого применяйте корректный encoding в рабочем импорте. При новом UnicodeDecodeError остановите импорт, сохраните смещение и запросите исходный файл заново; не используйте errors="ignore" для финансовых или персональных данных.

#Команды и примеры для проверки

Python
Файл data.csv должен находиться в текущем каталоге; разделитель ; приведён только для CSV с точкой с запятой. Если у вас запятая, не задавайте delimiter или укажите ,.
import csv

with open("data.csv", "r", encoding="utf-8-sig", newline="") as f:
    rows = csv.DictReader(f, delimiter=";")
    print("Столбцы:", rows.fieldnames)
    for index, row in enumerate(rows):
        if index >= 3:
            break
        print(row)

#Как проверить результат и что делать дальше

Успешный результат: CSV прочитан целиком, имена полей не начинаются с , кириллица совпадает с источником, число записей верно. Если проблема возникла лишь с отдельными файлами поставщика, сохраните их исходные байты и договоритесь о фиксированной кодировке выгрузки.

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

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