Есть ли способ для Pandas 'read_csv C обработчик игнорировать или заменять ошибки синтаксического анализа Unicode? - PullRequest
1 голос
/ 20 февраля 2020

Большинство вопросов о чтении строк с диска в Python связаны с проблемами кода c. В отличие от этого, у меня есть CSV-файл, в котором просто нет данных с мусором. Вот как создать пример:

b = bytearray(b'a,b,c\n1,2,qwe\n10,-20,asdf')
b[10] = 0xff
b[11] = 0xff
with open('foo.csv', 'wb') as fid:
    fid.write(b)

Обратите внимание, что во второй строке третьего столбца есть два байта, 0xFF, которые не представляют никакой кодировки, только небольшой объем данных мусора.

Когда я пытаюсь прочитать это с pandas.read_csv:

import pandas as pd
df = pd.read_csv('foo.csv') # fails

Естественно, я получаю ошибку:

  File "pandas/_libs/parsers.pyx", line 881, in pandas._libs.parsers.TextReader.read
  ...
  File "pandas/_libs/parsers.pyx", line 1520, in pandas._libs.parsers._string_box_utf8
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte

Однако я могу успешно Прочтите этот файл, если я использую Pandas 'Python CSV engine:

df2 = pd.read_csv('foo.csv', engine='python') # success

В этом случае недопустимые символы заменяются U+EFBF символами, которые Unicode использует для представления «недопустимых символов».

Вопрос: есть ли способ для Pandas 'C CSV двигателя сделать то же самое, что и Python здесь?

1 Ответ

2 голосов
/ 20 февраля 2020

Замена недопустимых символов, которые вы видите с помощью механизма python, соответствует режиму errors='replace' при кодировании байтовоподобного объекта.

Вы можете прочитать csv, используя произвольную однобайтовую кодировку и перекодировать столбцы с помощью этого режима ошибки (передача преобразователя в read_csv или использование series.str.encode/decode методов), но это довольно громоздко, так как вы должны определить определенный c набор столбцов.

Для глобального эффекта, поскольку read_csv не поддерживает (пока) параметр errors, вы можете предварительно открыть файл с помощью встроенного python open, который его поддерживает.

df = pd.read_csv(open('foo.csv', errors='replace'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...