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