深入浅析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字符串中的单双引
Feb 16 Python
Python实现树的先序、中序、后序排序算法示例
Jun 23 Python
Python实现矩阵加法和乘法的方法分析
Dec 19 Python
Python Cookie 读取和保存方法
Dec 28 Python
对django中foreignkey的简单使用详解
Jul 28 Python
简单了解python变量的作用域
Jul 30 Python
Python中print函数简单使用总结
Aug 05 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
Jan 02 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
Python astype(np.float)函数使用方法解析
Jun 08 Python
python爬虫分布式获取数据的实例方法
Nov 26 Python
Python urlopen()参数代码示例解析
Dec 10 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的内置函数,通过DES算法对数据加密和解密
2012/06/21 PHP
PHP不用第三变量交换2个变量的值的解决方法
2013/06/02 PHP
ThinkPHP下表单令牌错误与解决方法分析
2017/05/20 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
jquery ajax属性async(同步异步)示例
2013/11/05 Javascript
快速掌握WordPress中加载JavaScript脚本的方法
2015/12/17 Javascript
基于javascript实现右下角浮动广告效果
2016/01/08 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
基于JavaScript实现图片剪切效果
2017/03/07 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
2017/12/06 Javascript
Intellij IDEA搭建vue-cli项目的方法步骤
2018/10/20 Javascript
Vue一次性简洁明了引入所有公共组件的方法
2018/11/28 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
2020/08/21 Javascript
在Express中提供静态文件的实现方法
2019/10/17 Javascript
jQuery实现推拉门效果
2020/10/19 jQuery
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
[02:26]2018DOTA2亚洲邀请赛赛前采访-Newbee篇
2018/04/03 DOTA
python的类变量和成员变量用法实例教程
2014/08/25 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
TF-IDF与余弦相似性的应用(一) 自动提取关键词
2017/12/21 Python
Python3 SSH远程连接服务器的方法示例
2018/12/29 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
2020/01/10 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
python中reload重载实例用法
2020/12/15 Python
日本非常有名的内衣丝袜品牌:GUNZE
2017/01/06 全球购物
豪华床上用品、床单和浴室必需品:Peacock Alley
2019/09/04 全球购物
物理专业本科生自荐信
2014/01/30 职场文书
欢送退休感言
2014/02/08 职场文书
《秋游》教学反思
2014/04/24 职场文书
售后服务承诺书模板
2014/05/21 职场文书
新员工考核评语
2014/12/31 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
幼儿园大班教学反思
2016/03/02 职场文书