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使用metaclass实现Singleton模式的方法
May 05 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 Python
调试Django时打印SQL语句的日志代码实例
Sep 12 Python
使用python快速实现不同机器间文件夹共享方式
Dec 22 Python
详解Python实现进度条的4种方式
Jan 15 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
python新式类和经典类的区别实例分析
Mar 23 Python
MATLAB数学建模之画图汇总
Jul 16 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
如何用python批量调整视频声音
Dec 22 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 Python
pytorch 如何使用float64训练
May 24 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实现搜索地理位置及计算两点地理位置间距离的实例
2016/01/08 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
Laravel 实现密码重置功能
2018/02/23 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
jquery text,radio,checkbox,select操作实现代码
2009/07/09 Javascript
JQuery autocomplete 使用手册
2010/04/01 Javascript
Google AJAX 搜索 API实现代码
2010/11/17 Javascript
EXT窗口Window及对话框MessageBox
2011/01/27 Javascript
用js实现小球的自由移动代码
2013/04/22 Javascript
JQuery中attr方法和removeAttr方法用法实例
2015/05/18 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
jquery实现无刷新验证码的简单实例
2016/05/19 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
2017/07/09 Javascript
Vue自定义指令详解
2017/07/28 Javascript
JavaScript函数节流和函数去抖知识点学习
2018/07/31 Javascript
微信小程序绑定手机号获取验证码功能
2019/10/22 Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
2020/01/12 Javascript
[41:20]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS DK
2014/05/26 DOTA
DJANGO-ALLAUTH社交用户系统的安装配置
2014/11/18 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
matplotlib.pyplot.plot()参数使用详解
2020/07/28 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
python中delattr删除对象方法的代码分析
2020/12/15 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
HTML5+CSS3实现无插件拖拽上传图片(支持预览与批量)
2017/01/05 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
优秀求职自荐信怎样写
2013/12/18 职场文书
就业协议书
2014/09/12 职场文书
酒店保洁员岗位职责
2015/02/26 职场文书
vue中data改变后让视图同步更新的方法
2021/03/29 Vue.js
Pyhton模块和包相关知识总结
2021/05/12 Python