Python 熊猫有什么办法';读取csv C引擎以忽略或替换Unicode解析错误?

Python 熊猫有什么办法';读取csv C引擎以忽略或替换Unicode解析错误?,python,pandas,csv,unicode,Python,Pandas,Csv,Unicode,在Python中,关于从磁盘读取字符串的大多数问题都涉及编解码器问题。相比之下,我有一个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,它们不表示任何编码,只表示少量垃圾数据 当我试着读这篇文章时:

在Python中,关于从磁盘读取字符串的大多数问题都涉及编解码器问题。相比之下,我有一个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
,它们不表示任何编码,只表示少量垃圾数据

当我试着读这篇文章时:

我自然会出错:

  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引擎,我可以成功读取此文件:

df2 = pd.read_csv('foo.csv', engine='python') # success
在这种情况下,无效字符将替换为Unicode用于表示“无效字符”的
U+EFBF
字符


问题:Pandas的CSV引擎有没有办法做与Python相同的事情?

在编码类似字节的对象时,用Python引擎替换看到的无效字符对应于
errors='replace'
模式

在这种错误模式下,您可以使用任意单字节编码和转码列来读取csv(将转换器传递到
read\u csv
或使用
series.str.encode/decode
方法),但这相当麻烦,因为您必须识别一组特定的列

对于全局效果,由于
read_csv
不支持
errors
参数,因此您可以使用python内置的
open
预打开该文件,它确实支持该参数

df = pd.read_csv(open('foo.csv', errors='replace'))

对于其他潜在读者:请注意,这里的解决方法仅适用于格式错误的utf-8数据,这在我的经验中是非常罕见的。在大多数情况下,解码错误并不意味着输入文件已损坏,而是意味着它使用了不同于默认utf-8的编码。然后,不丢失信息的正确解决方案是识别源编码,并使用
编码
参数(或事先对文件进行转码)正确读取,而不是关闭错误。
df = pd.read_csv(open('foo.csv', errors='replace'))