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使用PyFetion来发送短信的例子
Apr 22 Python
Python通过RabbitMQ服务器实现交换机功能的实例教程
Jun 29 Python
浅谈pandas用groupby后对层级索引levels的处理方法
Nov 06 Python
对python中的乘法dot和对应分量相乘multiply详解
Nov 14 Python
python selenium爬取斗鱼所有直播房间信息过程详解
Aug 09 Python
django和vue实现数据交互的方法
Aug 21 Python
python range实例用法分享
Feb 06 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
python 下载m3u8视频的示例代码
Nov 11 Python
Python基于unittest实现测试用例执行
Nov 25 Python
python读取excel数据并且画图的实现示例
Feb 08 Python
python使用pycharm安装pyqt5以及相关配置
Apr 22 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
如何利用php+mysql保存和输出文件
2006/10/09 PHP
php5中类的学习
2008/03/28 PHP
php Hex RGB颜色值互换的使用
2013/05/10 PHP
PHP中UNIX时间戳和日期间的转换与计算实例
2014/11/19 PHP
php读取mssql的ntext字段返回值为空的解决方法
2014/12/30 PHP
JavaScript 入门基础知识 想学习js的朋友可以参考下
2009/12/26 Javascript
高效的表格行背景隔行变色及选定高亮的JS代码
2010/12/04 Javascript
node.js中的http.response.write方法使用说明
2014/12/14 Javascript
JavaScript中switch语句的用法详解
2015/06/03 Javascript
基于jQuery实现Ajax验证用户名是否存在实例
2016/03/30 Javascript
node网页分段渲染详解
2016/09/05 Javascript
JS从非数组对象转数组的方法小结
2018/03/26 Javascript
vue-cli axios请求方式及跨域处理问题
2018/03/28 Javascript
vue监听键盘事件的快捷方法【推荐】
2018/07/11 Javascript
JavaScript学习笔记之基于定时器实现图片无缝滚动功能详解
2019/01/09 Javascript
详解将微信小程序接口Promise化并使用async函数
2019/08/05 Javascript
Vue使用NProgress的操作过程解析
2019/10/10 Javascript
vue keep-alive列表页缓存 详情页返回上一页不刷新,定位到之前位置
2019/11/26 Javascript
八大排序算法的Python实现
2021/01/28 Python
Python实现简单的四则运算计算器
2016/11/02 Python
python中学习K-Means和图片压缩
2017/11/20 Python
详解PyTorch批训练及优化器比较
2018/04/28 Python
利用Python如何将数据写到CSV文件中
2018/06/05 Python
利用python打开摄像头及颜色检测方法
2018/08/03 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
对pandas处理json数据的方法详解
2019/02/08 Python
解决django后台样式丢失,css资源加载失败的问题
2019/06/11 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
Penhaligon’s英国官网:成立于1870年的英国香水制造商
2021/02/18 全球购物
模特职业生涯规划范文
2014/02/26 职场文书
企业办公室岗位职责
2014/03/12 职场文书
酒店开业策划方案
2014/06/02 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
经营场所证明范本
2015/06/19 职场文书
晶体管来复再生式二管收音机
2021/04/22 无线电
Python 中的 copy()和deepcopy()
2021/11/07 Python