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 相关文章推荐
Python3实现Web网页图片下载
Jan 28 Python
详解设计模式中的工厂方法模式在Python程序中的运用
Mar 02 Python
基于Python __dict__与dir()的区别详解
Oct 30 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
python获取地震信息 微信实时推送
Jun 18 Python
Djang的model创建的字段和参数详解
Jul 27 Python
Python面向对象之Web静态服务器
Sep 03 Python
python实现七段数码管和倒计时效果
Nov 23 Python
opencv+python实现均值滤波
Feb 19 Python
python Scrapy框架原理解析
Jan 04 Python
Python 全局空间和局部空间
Apr 06 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
Smarty中常用变量操作符汇总
2014/10/27 PHP
PHP实现类似于C语言的文件读取及解析功能
2017/09/01 PHP
PHP实现的AES加密、解密封装类与用法示例
2018/08/02 PHP
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
jquery封装的对话框简单实现
2013/07/21 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
jQuery的Read()方法代替原生JS详解
2016/11/08 Javascript
微信小程序(三):网络请求
2017/01/13 Javascript
jQuery EasyUI tree增加搜索功能的实现方法
2017/04/27 jQuery
jquery手机触屏滑动拼音字母城市选择器的实例代码
2017/12/11 jQuery
细说webpack源码之compile流程-入口函数run
2017/12/26 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
layui 设置table 行的高度方法
2018/08/17 Javascript
微信小程序框架wepy之动态控制类名
2018/09/14 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
vue项目创建并引入饿了么elementUI组件的步骤
2019/04/11 Javascript
inquirer.js一个用户与命令行交互的工具详解
2019/05/18 Javascript
解析JS在获取当前月的最后一天遇到的坑
2019/08/30 Javascript
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
Python partial函数原理及用法解析
2019/12/11 Python
Numpy一维线性插值函数的用法
2020/04/22 Python
Python手动或自动协程操作方法解析
2020/06/22 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
2014新课程改革心得体会
2014/03/10 职场文书
彩色的翅膀教学反思
2014/04/25 职场文书
2015年检验科工作总结
2015/04/27 职场文书
北京爱情故事观后感
2015/06/12 职场文书
Jsonp劫持学习
2021/04/01 PHP
JavaScript前端面试扁平数据转tree与tree数据扁平化
2022/06/14 Javascript