用熊猫中的二进制数据加载CSV文件

问题描述 投票:0回答:1

我正在尝试(从外部数据源中)解析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

我更喜欢只使用熊猫的解决方案,但如果绝对必要,我愿意看一下其他解析库。

python pandas csv python-unicode
1个回答
2
投票

根据Serge Ballesta回答this post

“熊猫允许指定编码,但不允许忽略错误而不是自动替换有问题的字节。因此,没有一种大小适合所有方法,而是根据实际使用情况采用不同的方式。”

  1. 因此,首先尝试使用Latin1编码,因为它接受任何可能的字节作为输入,并且根据您的用例可能就足够了(我可以使用此示例来运行您的玩具示例:]

    data_frame = pd.read_csv(BytesIO(csv), encoding="latin1"))
    
  2. 如Serge的回答中所述:“ Pandas没有进行特殊错误处理的准备,但是Python open函数具有(假设Python3),并且read_csv接受类似object的文件。”对于您的情况,您可以考虑使用'backslashreplace',用其反斜杠转义序列替换有问题的字节:

    file_encoding = 'utf8'        # set file_encoding to the file encoding (utf8, latin1, etc.)
    with open(path_to_csv, encoding=file_encoding, errors = 'backslashreplace') as my_csv:
      dataframe = pd.read_csv(my_csv)
    
© www.soinside.com 2019 - 2024. All rights reserved.