UnicodeDecodeError告诉您引起错误的字符位置。如何显示该角色?

时间:2019-03-17 02:21:58

标签: python pandas unicode python-unicode

使用

打开/读取文件时
with open(<csv_file>) as f:
    df = pandas.read_csv(f)

可能会出现诸如

的错误
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 1678

我知道我可以使用vscode扩展名将字符定位在csv_file中的位置1678。但是有什么方法可以使用python做到这一点。天真地像。

>>getCharInPosition(1678)
"The character is that position is 'x'"

甚至更好,获得行号

>>getLineNumOfCharInPosition(1678)
"The line number for the character in that position is 25"

我正在寻找一种使标准UnicodeDecodeError消息比仅告诉我字符位置更有用的方法。

1 个答案:

答案 0 :(得分:0)

UnicodeError的属性中有很多信息。

通过捕获异常,您可以利用此漏洞找到有问题的字节:

try:
    df = pandas.read_csv(f)
except UnicodeError as e:
    offending = e.object[e.start:e.end]
    print("This file isn't encoded with", e.encoding)
    print("Illegal bytes:", repr(offending))
    raise

为了确定行号,您可以执行以下操作(在except子句中):

    seen_text = e.object[:e.start]
    line_no = seent_text.count(b'\n') + 1

...但是我不确定e.object是否始终是一个(字节)字符串(这可能会给大型文件带来额外的麻烦),所以我不知道它是否始终有效。

此外,在CSV文件中,如果某些单元格中有换行符,则换行符的数量可能大于逻辑行的数量。