深入浅析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后台管理程序
Apr 13 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
Python用户推荐系统曼哈顿算法实现完整代码
Dec 01 Python
解决python super()调用多重继承函数的问题
Jun 26 Python
Python 实现输入任意多个数,并计算其平均值的例子
Jul 16 Python
Anaconda之conda常用命令介绍(安装、更新、删除)
Oct 06 Python
python有序查找算法 二分法实例解析
Feb 18 Python
使用 Python 读取电子表格中的数据实例详解
Apr 17 Python
Python命名空间namespace及作用域原理解析
Jun 05 Python
OpenCV4.1.0+VS2017环境配置的方法步骤
Jul 09 Python
Jupyter Notebook安装及使用方法解析
Nov 12 Python
python爬虫如何解决图片验证码
Feb 14 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支持页面回退的两种方法
2008/01/10 PHP
php 生成文字png图片的代码
2011/04/17 PHP
php更新mysql后获取改变行数的方法
2014/12/25 PHP
php实现httpRequest的方法
2015/03/13 PHP
php安装swoole扩展的方法
2015/03/19 PHP
ThinkPHP中limit()使用方法详解
2016/04/19 PHP
PHP substr()函数参数解释及用法讲解
2017/11/23 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
Javascript和Ajax中文乱码吐血版解决方案
2009/12/21 Javascript
javascript中parseInt()函数的定义和用法分析
2014/12/20 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
javascript实现网页屏蔽Backspace事件,输入框不屏蔽
2015/07/21 Javascript
Angular的事件和表单详解
2016/12/26 Javascript
JavaScript定时器设置、使用与倒计时案例详解
2019/07/08 Javascript
在Python中使用Mako模版库的简单教程
2015/04/08 Python
Python functools模块学习总结
2015/05/09 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
python探索之BaseHTTPServer-实现Web服务器介绍
2017/10/28 Python
对numpy中shape的深入理解
2018/06/15 Python
python求质数的3种方法
2018/09/28 Python
python创建与遍历List二维列表的方法
2019/08/16 Python
pytorch 常用函数 max ,eq说明
2020/06/28 Python
Python如何对XML 解析
2020/06/28 Python
python3跳出一个循环的实例操作
2020/08/18 Python
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
英国玛莎百货澳大利亚:Marks & Spencer Australia
2019/08/30 全球购物
类的核心特性有哪些
2014/01/01 面试题
农村结婚典礼司仪主持词
2014/03/14 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
县政府办公室领导班子对照检查材料思想汇报
2014/09/28 职场文书
房屋财产继承协议书范本
2014/11/03 职场文书
工作证明书
2015/06/15 职场文书
同学会感言
2015/07/30 职场文书
python绘制云雨图raincloud plot
2022/08/05 Python