1遇到文件中有错误编码的字符,会导致读取文件报错
一 现象
文件是想用utf-8解析,文件格式也是该格式,但是其中包含部分乱码,使用如下代码解析,会报错
f = open("test,txt", "r")
data = f.readline()
报错
data = fb.readline()
File "/usr/lib/python3.5/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 1: invalid start byte
二 原因
文件中出现,无法识别的编码(乱码),使用如上代码解析,会默认使用“utf-8”解析,但是遇到乱码部分无法解析,出现报错
<<80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xf`à^^x^^`<86>~f<9e>`<98><86><98>^^f^^~fx^F^^~f<9e>`<98><9e>^^f^^~f<86><98>^^^^<98><86><98>ø<9e>ø^^~<86>`x<9e>`x ø<98><86>à<98><86><98><98>~føxxþ^^f^^<9e>`^^xxþ^^x<86>~f<9e>`xàx^^æ<80><98><9e><80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xf`à`à`ø<9e><86><98>ø<9e>ø<9e><98> <98>^^ø<9e>þ<86>æ<9e>~^^øx<86>^^<9e><86><98>ø<9e>ø<9e><98><98>^^ø<9e>þ<86>æ<9e>^F^^<9e>^F<9e>xf<98><86>^^<9e>à<9e>fxf^^^^f8~^Fx^^`x<9e>`x<86>~f<9e>`xàx^^xø<98><86><98>à<98><86><98><98>~fxæ<80>< 98><9e><80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xf`à<98>àxxà`<9e><9e><80><9e><98><9e>øx<86>^^<9e><86><9e>`<9e><86>~<98><80>^^~^^<9e>`<9e>^^~<9e><86>x<98>< 86><98><86>xþ<86>f~f<9e>`~x`xæ^Føxø<9e><86><9e>`^^x~^F^^~^^<9e>`<9e>^^~^^x<86>~f<9e>`<98><9e><9e>àx^^æææ<80><98><9e><80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^ `^^xf`àxx`~^F<9e>æ<9e><86><98>æ^^<9e><86>^^<9e><86><98>ø<9e>ø<9e><98><98>^^ø<9e>øx<86>^F<98>æ<9e><86>ø<98>ø<9e><86><80><9e>^F^^<9e>`^^^^fø~x`x^^æ^Føxà8æ<9e><86>ø<98>ø^^x<9e>^F^^<9e>`^^^^føxà<98 ><80>^^^^à^^fxà<86>x<86>~f<9e>`<98>þxàx^^xø<98><86>~æxxæ<80><98><9e><80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xf`à^^x`ø<9e><86>~`<98><98><9e>~<9e><86>^^<9e ><86><98>ø<9e>ø<9e><98><98>^^ø<9e>øx<86>^F<98>æ<9e><86>ø<98>ø<9e><86><80><9e>^F^^<9e>`^^^^fø~~xx`<9e>`øà<98>æ<9e><86>ø<98>ø^^x<9e>^F^^<9e>`^^^^føxà<98><80>^^^^à^^fxà<86>x<86>~f<9e>`<98>þxàx^^xø <98><86>~æxxæ<80><98><9e><80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xf`à<98>æ`^^à`~^F^^~^^<9e>þ<86>^^<9e><86><98>ø<9e>ø<9e><98><98>^^ø<9e>øx<86>^F<98>æ<9e>< 86>ø<98>ø<9e><86><80><9e>^F^^<9e>`^^^^fø~^Fxàx^^æ^Føxà<98>æ><86>ø<98>ø^^x<9e>^F^^<9e>`^^^^føxà<98><80>^^^^à^^fxà<86>x<86>~f<9e>`<98>þxàx^^xø<98><86>~æx`^^<98><<80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx ^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xx``àx^^à`<86>~f<9e>`<98><86><98>^^f^^~fx^F^^~f<9e>`<98><9e>^^f^^~f<86><98>^^^^<98><86><98>ø<9e>ø^^~<86>`x<9e>`xø<98><86><98>à<98><86><98><98>~føxx þ^^f^^<9e>`^^xxþ^^x<86>~f<9e>`xàx^^æ<80><98><9e><80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xx``x~x`ø<9e><86><98>ø<9e>ø<9e><98><98>^^ø<9e>þ<86>æ<9e>~^^øx<86> ^^<9e><86><98>ø<9e>ø<9e><98><98>^^ø<9e>þ<86>æ<9e>^F^^<9e>^F<9e>xf<98><86>^^<9e>à<9e>fxf^^^^f8~^Fx^^`x<9e>`x<86>~f<9e>`xàx^^xø<98><86><98>à<98><86><98><98>~fxæ<80><98><9e><80><9e>æ`<9e><9e>^^<9e >æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xx``x<80>x`<9e><9e><80><9e><98><9e>øx<86>^^<9e><86><9e>`<9e><86>~<98><80>^^~^^<9e>`<9e>^^~<9e><86>x<98><86><98><86>xþ<86>f~f<9e>`~x`xæ^F øxø<9e><86><9e>`^^x~^F^^~^^<9e>`<9e>^^~^^x<86>~f<9e>`<98><9e><9e>àx^^æææ<80><98><9e><80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xx``^^^F^^`~^F<9e>æ<9e><86><9 8>æ^^<9e><86>^^<9e><86><98>ø<9e>ø<9e><98><98>^^ø<9e>øx<86>^F<98>æ<9e><86>ø<98>ø<9e><86><80><9e>^F^^<9e>`^^^^fø~x`x^^æ^Føxà8æ<9e><86>ø<98>ø^^x<9e>^F^^<9e>`^^^^føxà<98><80>^^^^à^^fxà<86>x<86>~f<9 e>`<98>þxàx^^xø<98><86>~æxxæ<80><98><9e><80><9e>æ`<9e><9e>^^<9e>æ`xx<9e>xx^^`<9e><9e><9e>^^fææ<9e><80><9e>æ`<9e>^^x^^`^^xx``æ`xà`ø
三 解决方法
f = open("test,txt", "r") #默认utf-8读取文件
改成
f = open("test.txt", "rb") # 使用二进制读取文件
data = f.readline()
改成
data = f.readline()
data = data.decode('utf-8', 'ignore') #ignore"的作用就是有异常就越过
如上改法,可以跳过乱码部分