7

Ошибка UnicodeDecodeError при чтении CSV-файла в Pandas

5

Я запускаю программу, которая обрабатывает 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 ответ(ов)

2

Самое простое решение:

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"
0

Pandas позволяет задавать кодировку, но не предоставляет возможности игнорировать ошибки, чтобы автоматически заменить проблемные байты. Поэтому нет универсального решения, а есть разные подходы в зависимости от конкретного случая использования.

  1. Вы знаете кодировку, и в файле нет ошибок кодировки. Отлично: вам просто нужно указать кодировку:

    file_encoding = 'cp1252'  # задайте file_encoding в соответствии с кодировкой файла (utf8, latin1 и т. д.)
    pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
    
  2. Вам не хочется заморачиваться с вопросами кодировки, и вы просто хотите, чтобы файл загрузился, даже если некоторые текстовые поля содержат "мусор". В таком случае достаточно использовать кодировку latin1, так как она принимает любые возможные байты на вход (и преобразует их в символ юникода того же кода):

    pd.read_csv(input_file_and_path, ..., encoding='latin1')
    
  3. Вы знаете, что большая часть файла записана в определенной кодировке, но он также содержит ошибки кодировки. Пример из реальной жизни – это 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, ...)
    
0

Попробуйте добавить следующий код:

import pandas as pd
df = pd.read_csv('file.csv', encoding='unicode_escape')

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

Вы можете начать с загрузки всего лишь 1000 строк, чтобы быстро загрузить файл.

0

Обратите внимание, что приведенный вами код не считывает содержимое файла, а просто выводит объект файла. Чтобы определить кодировку файла '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 файла с правильной кодировкой.

0

Попробуйте изменить кодировку. В моем случае encoding = "utf-16" сработало.

df = pd.read_csv("file.csv", encoding='utf-16')
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь