有关在 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
,不代表任何编码,只是少量的垃圾数据。
当我尝试使用 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 引擎,我可以成功读取此文件:
df2 = pd.read_csv('foo.csv', engine='python') # success
在这种情况下,无效字符将替换为 Unicode 用于表示“无效字符”的 U+EFBF
字符。
问题:Pandas 的 C CSV 引擎有什么办法可以做与 Python 相同的事情吗?
最佳答案
使用 python 引擎看到的无效字符的替换对应于编码类字节对象时的 errors='replace'
模式。
您可以使用任意单字节编码读取 csv,并使用此错误模式对列进行转码(将转换器传递给 read_csv
或使用 series.str.encode/decode
方法),但它非常麻烦,因为您必须识别一组特定的列。
对于全局效果,由于 read_csv
尚不支持 errors
参数,因此您可以使用 python 内置 预先打开文件open
,它确实支持它。
df = pd.read_csv(open('foo.csv', errors='replace'))
关于python - Pandas 的 read_csv C 引擎有什么方法可以忽略或替换 Unicode 解析错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60311784/