Python中解码decode()与编码encode()与错误处理UnicodeDecodeError: 'gbk' codec can't decode byte 0xab
编码方法encoding()
描述
encode() 方法以指定的编码格式编码字符串,默认编码为 'utf-8'。将字符串由string类型变成bytes类型。
对应的解码方法:bytes decode() 方法。
语法
str.encode([encoding
=
'utf-8'
][,errors
=
'strict'
])
- str是表示需要编码的字符串,并且是个string类型。
- encoding -- 可选参数,要使用的编码方案,默认编码为 'utf-8'。
- errors -- 可选参数,设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。
返回值
该方法返回编码后的字符串,它是一个 bytes 对象,这个字节对象是用于下面的解码用的。
官方文档解释:
str.
encode
(encoding="utf-8", errors="strict")
Return an encoded version of the string as a bytes object. Default encoding is 'utf-8'
. errors may be given to set a different error handling scheme. The default for errors is 'strict'
, meaning that encoding errors raise a UnicodeError
. Other possible values are 'ignore'
, 'replace'
, 'xmlcharrefreplace'
, 'backslashreplace'
and any other name registered via codecs.register_error()
, see section Error Handlers. For a list of possible encodings, see section Standard Encodings.
------------------------------------------------------------------------------------------------------------------------------------------------
解码方法decode()
decode() 方法以 encoding 指定的编码格式来解码字符串。默认编码规则是encoding=‘utf-8’
语法:
bytes.decode(encoding='UTF-8',errors='strict')
参数
bytes是由编码方法encoding()编码转换过后得到的字符串的字节表示值。
encoding -- 解码时要使用的编码方案,如"UTF-8"。
errors -- 设置不同错误的处理方案。默认为 'strict',意为编码错误引起一个UnicodeError。 其他可能得值有 'ignore', 'replace', 'xmlcharrefreplace', 'backslashreplace' 以及通过 codecs.register_error() 注册的任何值。
返回值:
该方法返回解码后的字符串。
官方文档解释
bytes.
decode
(encoding="utf-8", errors="strict")bytearray.
decode
(encoding="utf-8", errors="strict")
Return a string decoded from the given bytes. Default encoding is 'utf-8'
. errors may be given to set a different error handling scheme. The default for errors is 'strict'
, meaning that encoding errors raise a UnicodeError
. Other possible values are 'ignore'
, 'replace'
and any other name registered via codecs.register_error()
, see section Error Handlers. For a list of possible encodings, see section Standard Encodings.
Note
Passing the encoding argument to str
allows decoding any bytes-like object directly, without needing to make a temporary bytes or bytearray object.
Changed in version 3.1: Added support for keyword arguments.
其实编码解码的关系就是如下:
str->bytes:encode编码 bytes->str:decode解码
字符串通过编码成为字节码,字节码通过解码成为字符串。可以这样解释,编码就是将字符串转换成字节码,涉及到字符串的内部表示。解码就是将字节码转换为字符串,将比特位显示成字符。
例如:
>>> text = '我是文本'
>>> text
'我是文本'
>>> print(text)
我是文本
>>> bytesText = text.encode()
>>> bytesText
b'\xe6\x88\x91\xe6\x98\xaf\xe6\x96\x87\xe6\x9c\xac'
>>> print(bytesText)
b'\xe6\x88\x91\xe6\x98\xaf\xe6\x96\x87\xe6\x9c\xac'
>>> type(text)
<class 'str'>
>>> type(bytesText)
<class 'bytes'>
>>> textDecode = bytesText.decode()
>>> textDecode
'我是文本'
>>> print(textDecode)
我是文本
例2
>>>text='我好吗'
>>>byteText=text.encode('gbk')
>>>byteText
b'\xce\xd2\xba\xc3\xc2\xf0'
>>>strText=byteText.decode('gbk')
>>>strText
'我好吗'
>>>byteText.decode('utf-8')
Traceback (most recent call last):
File "G:\softs\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2862, in run_code
exec(code_obj, self.user_global_ns, self.user_ns)
File "<ipython-input-11-f0ef1443f388>", line 1, in <module>
byteText.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xce in position 0: invalid continuation byte
上面的第8行出现了错误,是由于文本text='我好吗',是按照‘gbk’进行编码的,而在解码时是按照‘utf-8’的编码规则进行的解码,所以会导致解码失败,即‘utf-8’不能解码‘gbk’编码规则的字节。用相对应的解码编码规则来对字符进行处理。下面给出了几条处理这种错误的方法供参考。
出现如下错误时:
UnicodeDecodeError: 'gbk' codec can't decode byte 0xab in position 11126: illegal multibyte sequence
使用python的时候经常会遇到文本的编码与解码问题,其中很常见的一种解码错误如题目所示,下面介绍该错误的解决方法,将‘gbk’换成‘utf-8’也适用。
(1)、首先在打开文本的时候,设置其编码格式,如:open(‘1.txt’,encoding=’gbk’);
(2)、若(1)不能解决,可能是文本中出现的一些特殊符号超出了gbk的编码范围,可以选择编码范围更广的‘gb18030’,如:open(‘1.txt’,encoding=’gb18030’);
(3)、若(2)仍不能解决,说明文中出现了连‘gb18030’也无法编码的字符,可以使用‘ignore’属性进行忽略,如:open(‘1.txt’,encoding=’gb18030’,errors=‘ignore’);
(4)、还有一种常见解决方法为open(‘1.txt’).read().decode(‘gb18030’,’ignore’)
对于机器学习实战第四章朴素贝叶斯一张代码实现出现的解码错误就用了上面的方法(4)解决了
def spamTest():
docList=[];classList=[];fillText=[]
for i in range(1,26):
wordList=textParse(open('D:/machinelearning data/machinelearninginaction/Ch04/email/spam/%d.txt' % i,encoding='utf-8',errors='ignore').read())
# print('%d word:'%i)
docList.append(wordList)
fillText.extend(wordList)
classList.append(1)
wordList = textParse(open('D:/machinelearning data/machinelearninginaction/Ch04/email/ham/%d.txt' % i,encoding='utf-8',errors='ignore').read())
docList.append(wordList)
fillText.extend(wordList)
classList.append(0)
原文上面代码出现错误是因为在解析ham文件夹文件23.txt时出现解码错误,才导致整个文件运行不了,我们将文件打开的编码方式统一换成'utf-8',并且忽略掉出现的错误便可以正常运行了
参考资料:
1,https://www.cnblogs.com/tingyugetc/p/5727383.html
2,https://blog.csdn.net/shijing_0214/article/details/51971734
Python中解码decode()与编码encode()与错误处理UnicodeDecodeError: 'gbk' codec can't decode byte 0xab的更多相关文章
- Anaconda中启动Python时的错误:UnicodeDecodeError: 'gbk' codec can't decode byte 0xaf in position 553
今天,在Anaconda prompt启动python遇到了如下错误: UnicodeDecodeError: ‘gbk’ codec can’t decode byte 0xaf in positi ...
- Python转码问题的解决方法:UnicodeDecodeError:‘gbk' codec can't decode bytes in position
在开发过程中遇到了错误:UnicodeDecodeError: ‘gbk' codec can't decode bytes in position 678-679...这是因为遇到了非法字符, 解决 ...
- Python读取文件时出现UnicodeDecodeError 'gbk' codec can't decode byte 0x80 in position x
Python在读取文件时 with open('article.txt') as f: # 打开新的文本 text_new = f.read() # 读取文本数据出现错误: UnicodeDecode ...
- Python读取文件时出现UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position xx: 解决方案
Python在读取文件时 with open('article.txt') as f: # 打开新的文本 text_new = f.read() # 读取文本数据 出现错误: UnicodeDecod ...
- python3 读取dbf文件报错 UnicodeDecodeError: 'gbk' codec can't decode
在读取dbf文件时由于编码问题报错:UnicodeDecodeError: 'gbk' codec can't decode byte 0xb5 in position 49: incomplete ...
- python编码问题:UnicodeDecodeError: 'gbk' codec can't decode
在获取yaml文件数据时,提示:UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 2: illegal multib ...
- python print 打印的数据包含中文,打印报错UnicodeDecodeError: 'gbk' codec can't decode bytes in position 459-460: illegal multibyte sequence解决办法
python 2.7 print 的数据中若包括中文,打印则会报错UnicodeDecodeError: 'gbk' codec can't decode bytes in position 459- ...
- python 读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multib
python 读取文件时报错UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 205: illegal multib ...
- 中文数据解码报错 UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence
UnicodeDecodeError: 'gbk' codec can't decode bytes in position 2-3: illegal multibyte sequence 失败原因: ...
随机推荐
- [BZOJ3162]独钓寒江雪
bzoj description 你要给一个树上的每个点黑白染色,要求白点不相邻.求本质不同的染色方案数. 两种染色方案本质相同当且仅当对树重新标号后对应节点的颜色相同. \(n\le 5\times ...
- 随笔——python截取http请求报文响应头
随笔——python截取http请求报文响应头 标签: pythonhttp响应头 2014-05-29 09:32 2114人阅读 评论(0) 收藏 举报 分类: 随笔(7) 版权声明:本文为博 ...
- OLEDB操作Excel
使用OLEDB操作Excel 的方法 OleDbConnection conn = null; try { //fileName ...
- pthread线程私有数据
进程内所有的线程共享地址空间,任何声明为静态或外部的变量,或在进程堆声明的变量都可以被进程内的所有线程读写. static,extern,或堆变量的值是上次线程改写的值 一个线程真正拥有的唯一私有存储 ...
- 时间记录 APP:爱今天脑图
时间记录 APP:爱今天脑图 爱今天 时间记录 以时间记录为主线 晨音 总结 目标 标签 统计 日统计 周统计 月统计 技能培养 一万小时定律 睡眠状态 番茄钟 时间间隔提醒 15 分钟 30 分钟 ...
- 【转】foxmail邮箱我已进清理了为什么还是说我的邮箱已满
原文网址:http://zhidao.baidu.com/link?url=YmX_tBenMVsCopjljd80e2Jwvh7H8GnVSrDLeKKBNQkh_Ty50IsX5eAIy4P_64 ...
- Zabbix 报警通知邮件和微信vim /etc/hosts
1安装 sendmail # yum -y install sendmail echo 'This is test mail'>body.txt mail -s 'Test mail' 3013 ...
- Bootstrap-Plugin:模态框(Modal)插件
ylbtech-Bootstrap-Plugin:模态框(Modal)插件 1.返回顶部 1. Bootstrap 模态框(Modal)插件 模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是 ...
- 解决Maven出现Plugin execution not covered by lifecycle configuration 错误
http://blog.163.com/xh_ding/blog/static/1939032892015222368827/ 解决Maven出现Plugin execution not covere ...
- servlet中获取配置文件中的参数.
web.xml (添加init-param) <?xml version="1.0" encoding="UTF-8"?> <web-app ...