Python-文件中有非UTF-8字符的处理方法

用Python读取含有含有非UTF-8的UTF-8文件

背景

自然语言处理中,某些语料库可能会含有不干净的字符,例如GBK混进了UTF-8中,使得Python程序读取的时候会抛出编码错误,下面介绍如何来处理。

过程

读取时候遇到编码错误通常会抛出UnicodeDecodeError

常用处理方法一:忽略

with open('somepath', 'r') as fp:
    line = fp.read()
    line = line.decode('utf-8', errors='ignore')

 # 或者
with open('somepath', 'r', errors='ignore') as fp:
    for line in fp:
        # do something

这样会忽略有编码错误的行,对数据的丢失率大。

常用处理方法二:替换

with open('somepath', 'r') as fp:
    line = fp.read()
    line = line.decode('utf-8', errors='replace')

 # 或者
with open('somepath', 'r', errors='replace') as fp:
    for line in fp:
        # do something

这种方法会使用’?’来替换有编码错误的字,对数据的丢失率较小。

还有其他处理方法,官方文档的 传送门,可以根据自己的需求来调用。

下面是引用经过翻译的一译Python3.5.2文档

  • 参数 errors是一个可选字符串,指定如何处理编码和解码错误 - 这不能在二进制模式下使用。虽然使用codecs.register_error()注册的任何错误处理名称也有效,但仍提供了多种标准错误处理程序(在错误处理程序下列出)。标准名称包括:
    • 'strict'引发ValueError例外,如果存在编码错误。默认值None具有相同的效果。
    • 'ignore'忽略错误。请注意,忽略编码错误可能会导致数据丢失。
    • 'replace'会导致替换标记(例如'?')插入到存在格式错误的数据的位置。
    • 'surrogateescape'将表示任何不正确的字节,作为从U DC80到U DCFF范围内的Unicode私人使用区域中的代码点。当写入数据时使用surrogateescape错误处理程序时,这些专用代码点将被转回相同的字节。这对于处理未知编码中的文件很有用。
    • 仅当写入文件时,才支持'xmlcharrefreplace'。编码不支持的字符将替换为相应的XML字符引用
    • 'backslashreplace'通过Python的反斜杠转义序列替换格式错误的数据。
    • 'namereplace'(也仅在编写时支持)用\ N {...}转义序列替换不支持的字符。