深入浅析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写的PHPMyAdmin暴力破解工具代码
Aug 06 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
python-opencv在有噪音的情况下提取图像的轮廓实例
Aug 30 Python
浅谈用VSCode写python的正确姿势
Dec 16 Python
解决python升级引起的pip执行错误的问题
Jun 12 Python
python判断计算机是否有网络连接的实例
Dec 15 Python
python+numpy实现的基本矩阵操作示例
Jul 19 Python
Python如何调用JS文件中的函数
Aug 16 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
详解Python并发编程之创建多线程的几种方法
Aug 23 Python
使用Keras预训练模型ResNet50进行图像分类方式
May 23 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个人网站架设连环讲(二)
2006/10/09 PHP
PHP查询MySQL大量数据的时候内存占用分析
2011/07/22 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
YII Framework框架教程之国际化实现方法
2016/03/14 PHP
PHP7导出Excel报ERR_EMPTY_RESPONSE解决方法
2019/04/16 PHP
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
图片轮换效果实现代码(点击按钮停止执行)
2013/04/12 Javascript
JS将数字转换成三位逗号分隔的样式(示例代码)
2014/02/19 Javascript
JSON相关知识汇总
2015/07/03 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
2016/06/12 Javascript
微信小程序 自己制作小组件实例详解
2016/12/22 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
对象不支持indexOf属性或方法的解决方法(必看)
2017/05/28 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
JavaScript中交换值的10种方法总结
2020/08/18 Javascript
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
基于Python_脚本CGI、特点、应用、开发环境(详解)
2017/05/23 Python
使用python Telnet远程登录执行程序的方法
2019/01/26 Python
Python-while 计算100以内奇数和的方法
2019/06/11 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
简单了解python中的与或非运算
2019/09/18 Python
python根据时间获取周数代码实例
2019/09/30 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
Python中base64与xml取值结合问题
2019/12/22 Python
python七种方法判断字符串是否包含子串
2020/08/18 Python
python中count函数知识点浅析
2020/12/17 Python
2014年母亲节寄语
2014/05/07 职场文书
电教室标语
2014/06/20 职场文书
房产公证书格式
2015/01/26 职场文书
公司财务经理岗位职责
2015/04/08 职场文书
Python四款GUI图形界面库介绍
2022/06/05 Python