it-swarm.com.ru

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

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

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

261
TravisVOX

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

Вы также можете использовать один из нескольких параметров alias, например 'latin' вместо 'ISO-8859-1' (см. документы python , также для многих других кодировок, с которыми вы можете столкнуться).

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

Чтобы определить кодировку (при условии, что файл содержит символы, отличные от ascii), вы можете использовать enca (см. man-страницу ) или file -i (linux) или file -I (osx) (см. man-страницу ). 

499
Stefan

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

  • Откройте файл CSV в текстовом редакторе Sublime.
  • Сохраните файл в формате utf-8.

В возвышенном нажмите Файл -> Сохранить с кодировкой -> UTF-8.

Затем вы можете читать свой файл как обычно:

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

Правка 1:

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

Просто прочитайте файл, используя

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

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

encoding = "cp1252"
encoding = "ISO-8859-1"
20
Gil Baggio

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', который просто подавляет ошибочные байты, или (IMHO лучше) '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, ...)
    
6
Serge Ballesta
with open('filename.csv') as f:
   print(f)

после выполнения этого кода вы найдете кодировку 'filename.csv', а затем выполните код следующим образом

data=pd.read_csv('filename.csv', encoding="encoding as you found earlier"

вот и ты

2
bhavesh

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

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

1
J. Ternent

Этот ответ, кажется, является всеобъемлющим для проблем кодирования CSV. Если вы получаете странную проблему с кодировкой вашего заголовка, например:

>>> f = open(filename,"r")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('\ufeffid', '1'), ... ])

Тогда у вас есть символ метки порядка байтов (BOM) в начале вашего CSV-файла. Этот ответ решает проблему:

Python read csv - спецификация, встроенная в первый ключ

Решение состоит в том, чтобы загрузить CSV с помощью encoding="utf-8-sig":

>>> f = open(filename,"r", encoding="utf-8-sig")
>>> reader = DictReader(f)
>>> next(reader)
OrderedDict([('id', '1'), ... ])

Надеюсь, это кому-нибудь поможет.

1
nbwoodward

Я использую Jupyter-ноутбук. И в моем случае, он показывал файл в неправильном формате. Опция «кодирование» не работала. Поэтому я сохраняю CSV в формате UTF-8, и это работает.

0
Himanshu Sharma

Попробуйте указать engine = 'python'. Это сработало для меня, но я все еще пытаюсь понять, почему.

df = pd.read_csv(input_file_path,...engine='python')
0
Jan33

Я публикую обновление в этой старой теме. Я нашел одно решение, которое сработало, но требует открытия каждого файла. Я открыл свой CSV-файл в LibreOffice, выбрал «Сохранить как»> «Изменить настройки фильтра». В выпадающем меню я выбрал кодировку UTF8. Затем я добавил encoding="utf-8-sig" к data = pd.read_csv(r'C:\fullpathtofile\filename.csv', sep = ',', encoding="utf-8-sig").

Надеюсь, это кому-нибудь поможет.

0
tshirtdr1

В моем случае файл имеет кодировку "USC-2 LE BOM", согласно Notepad ++. Это кодировка = "utf_16_le" для python. 

Надеюсь, это поможет кому-то быстрее найти ответ.

0