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?xxt^^f^^<9e>`^^xxt^^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>t<86>?<9e>~^^?x<86>^^<9e><86><98>?<9e>?<9e><98><98>^^?<9e>t<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>xt<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>txà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>txà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>t<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>txà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 t^^f^^<9e>`^^xxt^^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>t<86>?<9e>~^^?x<86> ^^<9e><86><98>?<9e>?<9e><98><98>^^?<9e>t<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>xt<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>txà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"的作用就是有异常就越过
如上改法,可以跳过乱码部分
|