深入浅析python3中的unicode和bytes问题


Posted in Python onJuly 03, 2019

最近写了一些python3程序,四处能看到bytes类型,而它并不存在于python2中,这也是python3和python2显著区别之一。

以前在写python2代码的时候,经常会遇到很多编码报错的异常,原因在于python2对unicode的支持不是特别理想。而在python3中,所有编写的代码都是unicode,python解析器在运行的时候,内部都转换(除非你显示定义为bytes类型)为unicode,减少了出错的可能性。

在python3中,有两种字符串类型,默认的就是str,即unicode,也叫做文本类型。但一个程序总是会有I/O操作(磁盘,网络),即I/O二进制数据,在python3中定义为bytes类型。bytes类型就是一个个字节串,包含0~256 之间的一个整数。

那么如何定义bytes类型呢,有两种显示的方法,比如:

#只能允许ASCII值
x=b'abc'
y=b'\xe6\x88\x91'
print (x,y)
#对unicode字符集进行特定编码
t=bytes("我们","UTF-8")
#输出b'\xe6\x88\x91\xe4\xbb\xac'
#一个中文字符,UTF-8编码占用三个字节
print (t)
#返回6,对于python来说,就是字节序列的长度
print (len(t))
#返回2,代表两个字符
print (len("我们"))

接下去说说str类型和bytes类型之间的转换,比如从网络上读取到二进制数据后,python需要你显示的将其转换为str类型,也就是说 python不会隐式在str和bytes之间转换 ,看上去麻烦了很多,但会减少你出错的几率,自己明确自己做要的事情。

如果要将str转换为bytes,必须选择一个编码,明确二进制数据是如何编码的,比如:

x="我"
y=x.encode("UTF-8")
z=x.encode("GBK")
#b'\xe6\x88\x91' b'\xce\xd2'
print (y,z)

如果要将bytes转换为str,也需要一个编码,必须说明的是,你必须知道 二进制数据的编码是什么 ,如果选错了,转换为unicode的时候会错误,另外在python内部,它不关心二进制数据是什么编码的,只要是bytes类型, 它就是一串字节序列 ,比如:

x=b'\xe6\x88\x91'
print (x.decode("UTF-8"))
#会报错
print (x.decode("GBK"))

总之一句话,“ python内部使用unicode,外部使用bytes类型 ”,python内建库中,很多函数会说明需要str类型还是bytes类型(严格说来是bytes-like对象,比如bytes、bytearray ),在写代码的时候一定要看清楚,比如 hamc 库的new方法,就要求:

hmac.new(key, msg=None, digestmod=None) key is a bytes or bytearray object giving the secret key

很多库,尤其第三方库(比如requests)为了兼容python2和python3,会在内部做很多转换工作,让你意识不到bytes类型的存在,虽然生产力提高了,但对于理解python并没有太大的好处。

如果要充分理解bytes和str的应用,可以参考open和write两个内建函数。

使用文本方式打开文件,python在内部会自动转换为str类型,比如:

file ="t.txt"
t = open(file,mode="r").read()

而如果是二进制方式打开,如果要显示在终端,需要转换为str类型,比如:

file ="t.txt"
t = open(file,mode="rb").read()
print (t.decode())
print (t,type(t))

而如果是二进制方式写入,则将bytes类型数据直接写入,比如:

file="t.txt"
t=open(file,mode="wb")
t.write(b'\xe6\x88\x91')

在上面几个例子中,都没有说明使用那种编码,如果不显示指定,一般编码等同于locale.getpreferedencoding()

总结

以上所述是小编给大家介绍的python3中的unicode和bytes问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
使用Python的PIL模块来进行图片对比
Feb 18 Python
python matplotlib画图实例代码分享
Dec 27 Python
实例讲解python中的序列化知识点
Oct 08 Python
python实现感知器算法(批处理)
Jan 18 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 Python
详解Python字典的操作
Mar 04 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
Apr 05 Python
使用python serial 获取所有的串口名称的实例
Jul 02 Python
python list转置和前后反转的例子
Aug 26 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
Python爬虫实现selenium处理iframe作用域问题
Jan 27 Python
python中numpy数组与list相互转换实例方法
Jan 29 Python
10款最好的Python开发编辑器
Jul 03 #Python
python基于递归解决背包问题详解
Jul 03 #Python
Python跳出多重循环的方法示例
Jul 03 #Python
Python多版本开发环境管理工具介绍
Jul 03 #Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 #Python
Python flask框架post接口调用示例
Jul 03 #Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 #Python
You might like
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
PHP自定义函数格式化json数据示例
2016/09/14 PHP
php使用preg_match()函数验证ip地址的方法
2017/01/07 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
Laravel 实现数据软删除功能
2019/08/21 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
2012/02/03 Javascript
仿微博字符限制效果实现代码
2012/04/20 Javascript
JavaScript高级程序设计(第3版)学习笔记12 js正则表达式
2012/10/11 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
jQuery Dialog对话框事件用法实例分析
2016/05/10 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
深入理解requestAnimationFrame的动画循环
2016/09/20 Javascript
vue 中引用gojs绘制E-R图的方法示例
2018/08/24 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
[01:12]快闪回顾DOTA2亚洲邀请赛(DAC) 静候2018新征程开启
2018/03/11 DOTA
[00:56]PWL开团时刻DAY8——追追追追追!
2020/11/09 DOTA
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
使用python实现knn算法
2017/12/20 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
python 多线程重启方法
2019/02/18 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
详解Python:面向对象编程
2019/04/10 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
阿联酋最好的手机、电子产品和家用电器网上商店:Eros Digital Home
2020/08/09 全球购物
《从现在开始》教学反思
2014/04/15 职场文书
读书活动总结
2014/04/28 职场文书
给校长的建议书500字
2014/05/15 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
党风廉政建设个人总结
2015/03/06 职场文书
windows安装python超详细图文教程
2021/05/21 Python