Я пытаюсь проанализировать файл CSV (из внешнего источника данных), где в одном из столбцов используются несовместимые кодировки символов. Вместо того, чтобы пытаться заставить поставщика данных использовать согласованную кодировку, я хотел бы просто прочитать этот столбец как двоичные данные. Однако pandas.read_csv
, кажется, декодирует весь файл в строку перед синтаксическим анализом, так что это дает мне ошибки (UnicodeDecodeError). Вот пример игрушки (python 3):
>>> from io import BytesIO
>>> import pandas as pd
>>> csv = b'Encoding,Data\nascii,abc\nwindows-1252,\xae\nutf-8,\xe2\x80\x9c1\xe2\x80\x9d\n'
>>> pd.read_csv(BytesIO(csv))
Traceback (most recent call last):
File "pandas/_libs/parsers.pyx", line 1130, in pandas._libs.parsers.TextReader._convert_tokens
File "pandas/_libs/parsers.pyx", line 1254, in pandas._libs.parsers.TextReader._convert_with_dtype
File "pandas/_libs/parsers.pyx", line 1269, in pandas._libs.parsers.TextReader._string_convert
File "pandas/_libs/parsers.pyx", line 1459, in pandas._libs.parsers._string_box_utf8
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xae in position 0: invalid start byte
Я хотел бы получить результат, эквивалентный следующему:
>>> df = pd.DataFrame({'Encoding': ['ascii','windows-1252','utf-8'],
... 'Data': [b'abc',b'\xae',b'\xe2\x80\x9c1\xe2\x80\x9d']})
>>> df
Encoding Data
0 ascii b'abc'
1 windows-1252 b'\xae'
2 utf-8 b'\xe2\x80\x9c1\xe2\x80\x9d'
Который (в этом примере с игрушкой) мог бы быть обработан следующим образом: это:
>>> df.apply(lambda row: str(row.Data,row.Encoding), axis=1)
0 abc
1 ®
2 “1”
dtype: object
Я бы предпочел решения, использующие только pandas, но я готов посмотреть на другие библиотеки синтаксического анализа, если это абсолютно необходимо.