UnicodeDecodeError при чтении CSV-файла в панд с Python

Я запускаю программу, которая обрабатывает 30,000 подобных файлов. Случайное число из них останавливаются и производят эту ошибку...

   File "C:Importersrcdfmanimporter.py", line 26, in import_chr
     data = pd.read_csv(filepath, names=fields)
   File "C:Python33libsite-packagespandasioparsers.py", line 400, in parser_f
     return _read(filepath_or_buffer, kwds)
   File "C:Python33libsite-packagespandasioparsers.py", line 205, in _read
     return parser.read()
   File "C:Python33libsite-packagespandasioparsers.py", line 608, in read
     ret = self._engine.read(nrows)
   File "C:Python33libsite-packagespandasioparsers.py", line 1028, in read
     data = self._reader.read(nrows)
   File "parser.pyx", line 706, in pandas.parser.TextReader.read (pandasparser.c:6745)
   File "parser.pyx", line 728, in pandas.parser.TextReader._read_low_memory (pandasparser.c:6964)
   File "parser.pyx", line 804, in pandas.parser.TextReader._read_rows (pandasparser.c:7780)
   File "parser.pyx", line 890, in pandas.parser.TextReader._convert_column_data (pandasparser.c:8793)
   File "parser.pyx", line 950, in pandas.parser.TextReader._convert_tokens (pandasparser.c:9484)
   File "parser.pyx", line 1026, in pandas.parser.TextReader._convert_with_dtype (pandasparser.c:10642)
   File "parser.pyx", line 1046, in pandas.parser.TextReader._string_convert (pandasparser.c:10853)
   File "parser.pyx", line 1278, in pandas.parser._string_box_utf8 (pandasparser.c:15657)
 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xda in position 6: invalid    continuation byte

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

4 ответов


read_csv принимает encoding возможность работы с файлами в разных форматах. Я в основном использую read_csv('file', encoding = "ISO-8859-1") или encoding = "utf-8" для чтения, и вообще utf-8 на to_csv.

вы также можете использовать псевдоним 'latin1' вместо 'ISO-8859-1'.

посмотреть соответствующая документация панд, примеры документов python в csv-файлах, и множество связанных с этим вопросов здесь, на SO.


самое простое из всех решений:

  • откройте файл csv в возвышенный текстовый редактор.
  • сохраните файл в формате UTF-8.

в sublime нажмите Файл - > Сохранить с кодировкой - > UTF-8

затем вы можете прочитать файл как обычно:

import pandas as pd
data = pd.read_csv('file_name.csv', encoding='utf-8')

EDIT 1:

Если есть много файлов, то вы можете пропустить возвышенный шаг.

просто прочитайте файл с помощью

data = pd.read_csv('file_name.csv', encoding='utf-8')

и другие различные типы кодирования:

encoding = "cp1252"
encoding = "ISO-8859-1"

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

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

    file_encoding = 'cp1252'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    pd.read_csv(input_file_and_path, ..., encoding=file_encoding)
    
  2. вы не хотите, чтобы вас беспокоили вопросы кодирования, и только хочу, чтобы этот проклятый файл загружался, независимо от того, содержат ли некоторые текстовые поля мусор. Хорошо, вам нужно только использовать Latin1 кодировка, потому что она принимает любой возможный байт в качестве ввода (и преобразует его в символ Юникода того же кода):

    pd.read_csv(input_file_and_path, ..., encoding='latin1')
    
  3. вы знаете, что большая часть файла написана с определенной кодировкой, но она также содержит ошибки кодирования. Примером реального мира является файл UTF8, который был отредактирован с помощью редактора, отличного от utf8, и который содержит некоторые строки с другая кодировка. Pandas не имеет специального положения для обработки ошибок, но Python open функция имеет (предполагая Python3), и read_csv принимает файл как объект. Типичный параметр ошибки для использования здесь 'ignore' который просто подавляет оскорбительные байты или (ИМХО лучше) 'backslashreplace' который заменяет оскорбительные байты обратной косой escape-последовательностью Python:

    file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    input_fd = open(input_file_and_path, encoding=file_encoding, errors = 'backslashreplace')
    pd.read_csv(input_fd, ...)
    

боролся с этим некоторое время и думал, что я опубликую этот вопрос, поскольку это первый результат поиска. Добавление тега encoding='iso-8859-1" в pandas read_csv не сработало, как и любая другая кодировка, продолжая давать UnicodeDecodeError.

Если вы передаете дескриптор файла в pd.read_csv (), вам нужно поместить атрибут encoding= в файл open, а не в read_csv. Очевидно в ретроспективе, но тонкие ошибки отследить.