【问题标题】:Is there any way for Pandas' read_csv C engine to ignore or replace Unicode parsing errors?Pandas 的 read_csv C 引擎有什么方法可以忽略或替换 Unicode 解析错误?
【发布时间】:2020-02-20 01:44:55
【问题描述】:

大多数关于在 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

在这种情况下,无效字符被替换为U+EFBF Unicode 用来表示“无效字符”的字符。

问题:有没有办法让 Pandas 的 C CSV 引擎做与 Python 一样的事情?

【问题讨论】:

    标签: python pandas csv unicode


    【解决方案1】:

    用python引擎替换你看到的无效字符对应于编码字节类对象时的errors='replace'模式。

    您可以使用任意单字节编码读取 csv,并使用此错误模式对列进行转码(将转换器传递给 read_csv 或使用 series.str.encode/decode 方法)但这非常麻烦,因为您必须识别一组特定的列。

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

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

    【讨论】:

    • 致其他潜在读者:请注意,这里的解决方法仅适用于 格式错误的 utf-8 数据,这在我的经验。在大多数情况下,解码错误并不意味着输入文件已损坏,而是它使用的编码不同于默认的 utf-8。那么不丢失信息的正确解决方案是识别源编码并使用encoding参数(或预先转码文件)正确读取它,而不是关闭错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 2014-07-27
    相关资源
    最近更新 更多