UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte xx in position xx: invalid continuation byte

一、报错内容

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position xx: invalid continuation byte

二、报错翻译

Unicode解码错误: 'utf-8'编解码器无法解码位置(第38行)中的字节:因为这个字节是无效的延续字节
0xd6:0x开始能区分十六进制与十进制表达,这里是0xd6(十六进制)=6*1+13*16=214(十进制)=1101 0110(二进制),即本次无法解码:1101 0110

三、根源追溯

       在国际上,各个国家认可标准的ASCII编码,包含a-z、A-Z、0-9、常见键盘符等;在实际编程中,除了使用英文,我们也要使用本国的语言,于是各国产生了本国的ANSI编码,即在ASCII编码的基础上往前不断堆叠0和1,而ANSI编码在中国的规则是常见的gbk编码

       同样是二进制字节 1101 0110 ,gbk解码(我国ANSI编码)代表内容是和他国ANSI编码代表内容可以完全不一致,即我们常说的乱码问题。

       输入中文字符串时,在内存中是以unicode形式存储,我们也可以添加encoding参数指定以哪种编码方式存储,在win系统中,默认编码是ANSI编码,在简体中文的环境则为“gbk”,尤其一点,python的输出环境是默认为utf-8,即pandas库的to_csv默认结果为utf-8,而简体中文的excel遇到中文时是按gbk解码的,不加参数往往会遇到问题

因此,pandas库的to_csv往往添加参数  ,encoding=‘utf_8_sig’或者encoding=‘gbk’(‘ansi’)

补充编码解码的代码案例: 

s='中'  
print(ord(s))  #20013
'中'.encode('utf-8')   #b'\xe4\xb8\xad'
DATA = b'\xe4\xb8\xad'
DATA = str(DATA,'utf-8')
print(DATA)  #中

四、解决方案

(1)utf-8' codec can't decode byte 0xd6 in position xx: invalid continuation byte

在read_csv中添加:    encoding='ISO-8859-1'

import pandas as pd
Exposure_raw = pd.read_csv(r'D:\Program Files\Anaconda3\installation location\Lib\site-packages\addressparser\pca.csv', index_col=0,encoding='ISO-8859-1')

(2)'str' object has no attribute 'decode' (字符串对象没有编码属性)

———>需对字符串先编码成二进制,再解码

'张俊'.encode('utf-8').decode('utf-8')

而且,如果是: '张俊'.encode('utf-8').decode('gbk') 结果与上面不同

五、参考网址

(1)解码错误解决方案

Python——报错 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 52: invalid continuation byte问题解决 – 小猪课堂 – 博客园这里介绍一个在read_csv()时报错的原因为:(加工字为位置可以任意) UnicodeDecodeError: 'utf-8' codec can't decode bythttps://www.cnblogs.com/huangchenggener/p/10983812.html

(2)编码根源解释

浅谈python3中的编码问题-数据小站在python3中,默认使用的是unicode编码。当我们输入中文字符时,在内存中是按照unicode编码存储,当需要写入硬盘时,会根据系统环境,自动按照gkb、utf8编码存储,减少存储开销。当然我们可以指定编码。http://www.51dtsc.cn/?p=884(3)代码小案例

Python >>> b'\xe6\x88\x91'类型编码转换为汉字_原谅我这一生不羁放纵爱自由-CSDN博客当接收到类似这样的一串东西的时候:b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'而我们需要将其转换为汉字进行显示。则我们只需要在代码中将其编码换成utf-8 即可:DATA = b'\xe6\x88\x91\xe7\x88\xb1\xe4\xbd\xa0'DATA = str(DATA,'utf-8')print(DATA)输出结果:我爱你…https://blog.csdn.net/weixin_40973138/article/details/105593481(4)'str' object has no attribute 'decode'

AttributeError: ‘str‘ object has no attribute ‘decode‘解决方法_我爱柠檬博客-CSDN博客出现这个问题可能是两个原因造成的:1、Python2和Python3在字符串编码上的区别。2、Python 3.4: str : AttributeError: ‘str’ object has no attribute 'decode原因一的解决方法:print (‘张俊’.encode(‘utf-8’). decode(‘utf-8’) ) #必须将字节字符串解码后才能打印出来参考链接:https://www.cnblogs.com/geekard/archive/2012/10/04/pyhttps://blog.csdn.net/qq_43192819/article/details/108981008

—->方案1::先encode转为bytes,再decode
—->方案2:强制转换忽略错误:bytes.decode(‘’utf-8‘’, ‘’ignore‘’)

来源:weixin_43718742

物联沃分享整理
物联沃-IOTWORD物联网 » UnicodeDecodeError: ‘utf-8‘ codec can‘t decode byte xx in position xx: invalid continuation byte

发表评论