Ошибка UnicodeDecodeError при чтении CSV-файла в Pandas
Я запускаю программу, которая обрабатывает 30 000 похожих файлов. Однако некоторые из них останавливаются и выдают следующую ошибку:
File "C:\Importer\src\dfman\importer.py", line 26, in import_chr
data = pd.read_csv(filepath, names=fields)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 400, in parser_f
return _read(filepath_or_buffer, kwds)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 205, in _read
return parser.read()
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 608, in read
ret = self._engine.read(nrows)
File "C:\Python33\lib\site-packages\pandas\io\parsers.py", line 1028, in read
data = self._reader.read(nrows)
File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandas\parser.c:6745)
File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandas\parser.c:6964)
File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandas\parser.c:7780)
File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandas\parser.c:8793)
File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandas\parser.c:9484)
File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandas\parser.c:10642)
File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandas\parser.c:10853)
File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandas\parser.c:15657)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid continuation byte
Все файлы создаются из одного и того же источника. Как лучше всего исправить эту ситуацию, чтобы продолжить импорт?
5 ответ(ов)
Самое простое решение:
import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')
Альтернативное решение:
Для Sublime Text:
- Откройте файл CSV в Sublime Text или VS Code.
- Сохраните файл в формате utf-8.
- В Sublime перейдите в меню Файл → Сохранить с кодировкой → UTF-8.
Для VS Code:
В нижней части окна VS Code вы увидите надпись UTF-8. Нажмите на неё. Откроется всплывающее окно. Выберите "Сохранить с кодировкой". Теперь вы можете выбрать новую кодировку для этого файла.
После этого вы сможете читать файл как обычно:
import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')
Также доступны другие типы кодировок:
encoding = "cp1252"
encoding = "ISO-8859-1"
Pandas позволяет задавать кодировку, но не предоставляет возможности игнорировать ошибки, чтобы автоматически заменить проблемные байты. Поэтому нет универсального решения, а есть разные подходы в зависимости от конкретного случая использования.
Вы знаете кодировку, и в файле нет ошибок кодировки. Отлично: вам просто нужно указать кодировку:
file_encoding = 'cp1252' # задайте file_encoding в соответствии с кодировкой файла (utf8, latin1 и т. д.) pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
Вам не хочется заморачиваться с вопросами кодировки, и вы просто хотите, чтобы файл загрузился, даже если некоторые текстовые поля содержат "мусор". В таком случае достаточно использовать кодировку
latin1
, так как она принимает любые возможные байты на вход (и преобразует их в символ юникода того же кода):pd.read_csv(input_file_and_path, ..., encoding='latin1')
Вы знаете, что большая часть файла записана в определенной кодировке, но он также содержит ошибки кодировки. Пример из реальной жизни – это UTF-8 файл, который был отредактирован в редакторе с кодировкой, отличной от UTF-8, и в котором есть строки с другой кодировкой. Pandas не предоставляет возможности особой обработки ошибок, но функция
open
в Python имеет такую возможность (при условии, что вы используете Python 3), иread_csv
принимает объект, подобный файлу. Типичные параметры для обработки ошибок, которые можно использовать здесь, — это'ignore'
, который просто подавляет проблемные байты, или (по моему мнению, лучше)'backslashreplace'
, который заменяет проблемные байты на их escape-последовательности в Python:file_encoding = 'utf8' # задайте file_encoding в соответствии с кодировкой файла (utf8, latin1 и т. д.) input_fd = open(input_file_and_path, encoding=file_encoding, errors='backslashreplace') pd.read_csv(input_fd, ...)
Попробуйте добавить следующий код:
import pandas as pd
df = pd.read_csv('file.csv', encoding='unicode_escape')
Это должно помочь. У меня сработало. Также убедитесь, что вы используете правильный разделитель и имена столбцов.
Вы можете начать с загрузки всего лишь 1000 строк, чтобы быстро загрузить файл.
Обратите внимание, что приведенный вами код не считывает содержимое файла, а просто выводит объект файла. Чтобы определить кодировку файла 'filename.csv', вы можете воспользоваться следующим подходом:
with open('filename.csv', 'rb') as f:
byte_content = f.read()
# Используйте библиотеку chardet для определения кодировки
import chardet
result = chardet.detect(byte_content)
encoding = result['encoding']
print(f'Определенная кодировка: {encoding}')
Как только вы узнаете кодировку файла, вы можете использовать её при чтении данных через pandas
:
import pandas as pd
# Замените "определенная кодировка" на ту, которую вы нашли ранее
data = pd.read_csv('filename.csv', encoding='определенная кодировка')
Вот и все! Теперь вы сможете успешно загрузить данные из CSV файла с правильной кодировкой.
Попробуйте изменить кодировку. В моем случае encoding = "utf-16"
сработало.
df = pd.read_csv("file.csv", encoding='utf-16')
Запись DataFrame pandas в CSV файл
Создание DataFrame в Pandas путём последовательного добавления строк
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas
Как проверить, пустой ли DataFrame в pandas?