Python3中编码与解码之Unicode与bytes的讲解


Posted in Python onFebruary 28, 2019

今天玩Python爬虫,下载一个网页,然后把所有内容写入一个txt文件中,出现错误;

TypeError: write() argument must be str, not bytes
AttributeError: 'URLError' object has no attribute 'code'
UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' inposition 5747: illegal multibyte sequence

一看就是编码问题,不懂,度娘上面这方面讲得不多,感觉没说清楚,自己研究了一晚上,摸出了一点门道。

从头说起,由于各国语言文字不同,起初要在计算机中表示,就有了各种各样的编码(例如中文的gb2312)。但是这样就出现了兼容性的问题,所以就有了Unicode,也就是所谓的万国码,python3中字符串类型str就是以Unicode编码格式编码,所以我们在Python3 中看到多种语言文字的字符串而不会出现乱码。

编码是一种用一种特定的方式对抽象字符(Unicode)转换为二进制形式(bytes)进行表示,也就是python3中的encode。解码就是对用特定方式表示的二进制数据用特定的方式转化为Unicode,也就是decode。

下图就是编码的核心:

一、字符的编码:

Python对于bites类型的数据用带‘b‘前缀的单引号活双引号表示。

下面关于字符编码解码的代码很好的解释了上面的流程图:

s='你好'
print(s)#输出结果:你好
print(type(s))#输出结果:<class 'str'>
s=s.encode('UTF-8')
print(s)#输出结果:b'\xe4\xbd\xa0\xe5\xa5\xbd'
print(type(s))#输出结果:<class 'bytes'>
s=s.decode('UTF-8')
print(s)#输出结果:你好
print(type(s))#输出结果:<class 'str'>

多说一句,如果你对str类型字符进行decode会报错,同理,对bytes类型进行encode也会报错。

二、文件编码

在python 3 中字符是以Unicode的形式存储的,当然这里所说的存储是指存储在计算机内存当中,如果是存储在硬盘里,Python 3的字符是以bytes形式存储,也就是说如果要将字符写入硬盘,就必须对字符进行encode。对上面这段话再解释一下,如果要将str写入文件,如果以‘w'模式写入,则要求写入的内容必须是str类型;如果以‘wb'形式写入,则要求写入的内容必须是bytes类型。文章开头出现的集中错误,就是因为写入模式与写入内容的数据类型不匹配造成的。

s1 = '你好'
#如果是以‘w'的方式写入,写入前一定要进行encoding,否则会报错 
with open('F:\\1.txt','w',encoding='utf-8') as f1:
  f1.write(s1)
s2 = s1.encode("utf-8")#转换为bytes的形式
#这时候写入方式一定要是‘wb',且一定不能加encoding参数
with open('F:\\2.txt','wb') as f2:
  f2.write(s2)

有的人会问,我在系统里面用文本编辑器打开以bytes形式写入的2.txt文件,发现里面显示的是‘你好',而不是‘b'\xe4\xbd\xa0\xe5\xa5\xbd'',因为文本文档打开2.txt时,又会对它进行decode,然后才给你看到。

三、网页的编码

网页编码和文件编码方法差不多,如下urlopen下载下来的网页read()且用decoding(‘utf-8')解码,那就必须以‘w'的方式写入文件。如果只是read()而不用encoding(‘utf-8')进行编码,一定要以‘wb'方式写入:

以‘w'方式写入时:

response= url_open('https://3water.com/article/157034.htm ' ,timeout=5 )
#此处以UTF-8方式进行解码,解码后的数据以unicode的方式存储在html中
html = response.read().decode('UTF-8')
print(type(html))#输出结果:<class 'str'>
#这时写入方式一定要加encoding,以encoding
# 即UTF-8的方式对二进制数据进行编码才能写入
with open('F:\DownloadAppData\html.txt',"w" , encoding='UTF-8') as f:
  f.write(html)

以‘wb'方式写入:

response= url_open('https://3water.com/article/157034.htm ' ,timeout=5 )
html = response.read()#此处不需要进行解码,下载下来
print(type(html))#输出结果:<class 'bytes'>
with open('F:\DownloadAppData\html.txt',"wb" ) as f:
  f.write(html)

如果要在Python3中,对urlopen下来的网页进行字符搜索,肯定也要进行decode,例如使用lxml.etree就必须进行decode。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Python 相关文章推荐
python制作爬虫爬取京东商品评论教程
Dec 16 Python
Python利用flask sqlalchemy实现分页效果
Aug 02 Python
numpy排序与集合运算用法示例
Dec 15 Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
pytorch 图像中的数据预处理和批标准化实例
Jan 15 Python
Python如何通过Flask-Mail发送电子邮件
Jan 29 Python
keras小技巧——获取某一个网络层的输出方式
May 23 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
Dec 07 Python
k-means & DBSCAN 总结
Apr 27 Python
用python删除文件夹中的重复图片(图片去重)
May 12 Python
教你使用Python pypinyin库实现汉字转拼音
May 27 Python
Python multiprocessing多进程原理与应用示例
Feb 28 #Python
Python中的异常处理try/except/finally/raise用法分析
Feb 28 #Python
python使用phoenixdb操作hbase的方法示例
Feb 28 #Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
Feb 28 #Python
Python类的继承、多态及获取对象信息操作详解
Feb 28 #Python
django模板结构优化的方法
Feb 28 #Python
详解python做UI界面的方法
Feb 27 #Python
You might like
1.PHP简介
2006/10/09 PHP
PHP中读写文件实现代码
2011/10/20 PHP
PHP序列号生成函数和字符串替换函数代码
2012/06/07 PHP
PHP中如何定义和使用常量
2013/02/28 PHP
php恢复数组的key为数字序列的方法
2015/04/28 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
javascript replace方法与正则表达式
2008/02/19 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
jquery调用asp.net 页面后台的实现代码
2011/04/27 Javascript
Javascript中克隆一个数组的实现代码
2013/12/06 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
巧用replace将文字表情替换为图片
2014/04/17 Javascript
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
js实现最短的XML格式化工具实例
2015/03/12 Javascript
PHP+mysql+Highcharts生成饼状图
2015/05/04 Javascript
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
json字符串传到前台input的方法
2018/08/06 Javascript
微信小程序获取用户绑定手机号方法示例
2019/07/21 Javascript
layui form表单提交之后重新加载数据表格的方法
2019/09/11 Javascript
Vue自动构建发布脚本的方法示例
2020/07/24 Javascript
python获取远程图片大小和尺寸的方法
2015/03/26 Python
python实现汉诺塔方法汇总
2016/07/25 Python
python中的单引号双引号区别知识点总结
2019/06/23 Python
python日志模块logbook使用方法
2019/09/19 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
Matplotlib scatter绘制散点图的方法实现
2020/01/02 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
哥伦比亚加拿大官网:Columbia Sportswear Canada
2020/09/07 全球购物
Envie de Fraise意大利:法国网上推出的孕妇装品牌
2020/10/18 全球购物
自我评价的写作规则
2014/01/06 职场文书
2016年大学生社区服务活动总结
2016/04/06 职场文书
22句经典语录:送给优柔寡断和胡思乱想的朋友们
2019/12/13 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
如何使用SQL Server语句创建表
2022/04/12 SQL Server