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