栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python中的UnicodeDecodeError在读取文件时如何忽略错误并跳至下一行?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python中的UnicodeDecodeError在读取文件时如何忽略错误并跳至下一行?

您的文件似乎未使用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
如果“行”足够大,则可能导致异常。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/638480.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号