您的文件似乎未使用UTF-8编码。打开文件时使用正确的编解码器很重要。
您
可以
open()使用
errors关键字告诉如何处理解码错误:
errors 是一个可选字符串,用于指定如何处理编码和解码错误-
不能在二进制模式下使用。尽管已向其注册的任何错误处理名称precs.register_error()也有效,但是可以使用多种标准错误处理程序。标准名称是:
'strict'``ValueError如果存在编码错误,则引发异常。的默认值None具有相同的效果。 'ignore'忽略错误。请注意,忽略编码错误会导致数据丢失。 'replace'使替换标记(例如“?”)插入到数据格式不正确的地方。 'surrogateescape'将表示任何不正确的字节作为Unipre专用区中的代码点,范围从U + DC80到U +
DCFF。surrogateescape当在写入数据时使用错误处理程序时,这些专用代码点将被转换回相同的字节。这对于处理未知编码的文件很有用。 'xmlcharrefreplace'仅在写入文件时受支持。编码不支持的字符将替换为适当的XML字符引用&#nnn;。 'backslashreplace'(也仅在编写时受支持)用Python的反斜杠转义序列替换不支持的字符。
然后,使用除
'strict'(
'ignore',
'replace'等)以外的任何内容打开文件,即可读取文件而不会引发异常。
请注意,解码是按缓冲的数据块而不是文本行进行的。如果必须逐行检测错误,请使用
surrogateescape处理程序并测试代理范围内代码点的每一行读取:
import re_surrogates = re.compile(r"[uDC80-uDCFF]")def detect_decoding_errors_line(l, _s=_surrogates.finditer): """Return decoding errors in a line of text Works with text lines depred with the surrogateescape error handler. Returns a list of (pos, byte) tuples """ # DC80 - DCFF enpre bad bytes 80-FF return [(m.start(), bytes([ord(m.group()) - 0xDC00])) for m in _s(l)]
例如
with open("test.csv", encoding="utf8", errors="surrogateescape") as f: for i, line in enumerate(f, 1): errors = detect_decoding_errors_line(line) if errors: print(f"Found errors on line {i}:") for (col, b) in errors: print(f" {col + 1:2d}: {b[0]:02x}")请注意,并非所有解码错误都能正常恢复。尽管UTF-8的设计在遇到小错误时具有较强的鲁棒性,但其他多字节编码(例如UTF-16和UTF-32)无法应付丢失或多余的字节,这将影响行分隔符的准确度。位于。然后,上述方法可能导致文件的其余部分被视为一条长行。如果文件足够大,那么
MemoryError如果“行”足够大,则可能导致异常。



