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

Chi*_*nce 17 python file utf-8 python-3.x

我必须将文本文件读入Python.文件编码是:

file -bi test.csv 
text/plain; charset=us-ascii
Run Code Online (Sandbox Code Playgroud)

这是第三方文件,我每天都会得到一个新文件,所以我宁愿不改变它.该文件具有非ascii字符,例如Ö.我需要使用python读取行,并且我可以忽略具有非ascii字符的行.

我的问题是,当我在Python中读取文件时,在到达存在非ascii字符的行时,我得到UnicodeDecodeError,而我无法读取文件的其余部分.

有没有办法避免这种情况.如果我试试这个:

fileHandle = codecs.open("test.csv", encoding='utf-8');
try:
    for line in companiesFile:
        print(line, end="");
except UnicodeDecodeError:
    pass;
Run Code Online (Sandbox Code Playgroud)

然后当达到错误时,for循环结束,我无法读取文件的剩余部分.我想跳过导致错误的行并继续.如果可能的话,我宁愿不对输入文件进行任何更改.

有没有办法做到这一点?非常感谢你.

Mar*_*ers 49

您的文件似乎不使用UTF-8编码.打开文件时使用正确的编解码器很重要.

可以open()使用errors关键字告诉如何处理解码错误:

errors是一个可选字符串,指定如何处理编码和解码错误 - 这不能在二进制模式下使用.可以使用各种标准错误处理程序,但已注册的任何错误处理名称codecs.register_error()也是有效的.标准名称是:

  • 'strict'ValueError如果存在编码错误,则引发异常.默认值None具有相同的效果.
  • 'ignore'忽略错误.请注意,忽略编码错误可能会导致数据丢失.
  • 'replace' 导致在有错误数据的地方插入替换标记(例如"?").
  • 'surrogateescape'将表示任何不正确的字节作为Unicode专用区中的代码点,范围从U + DC80到U + DCFF.surrogateescape当在写入数据时使用错误处理程序时,这些私有代码点将被转回到相同的字节中.这对于处理未知编码的文件很有用.
  • 'xmlcharrefreplace'仅在写入文件时支持.编码不支持的字符将替换为相应的XML字符引用&#nnn;.
  • 'backslashreplace' (也只在写入时支持)用Python的反斜杠转义序列替换不支持的字符.

使用'strict'或打开文件'ignore'然后将允许您读取文件而不会引发异常.