深入浅析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单链表的简单实现方法
Sep 23 Python
从Python的源码浅要剖析Python的内存管理
Apr 16 Python
Python中在for循环中嵌套使用if和else语句的技巧
Jun 20 Python
Python简单实现安全开关文件的两种方式
Sep 19 Python
深入理解Python 关于supper 的 用法和原理
Feb 28 Python
Python从零开始创建区块链
Mar 06 Python
numpy下的flatten()函数用法详解
May 27 Python
Python实现栈和队列的简单操作方法示例
Nov 29 Python
python数据分析:关键字提取方式
Feb 24 Python
Python之字典添加元素的几种方法
Sep 30 Python
Python使用内置函数setattr设置对象的属性值
Oct 16 Python
五种Python转义表示法
Nov 27 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中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
PHP微信公众号自动发送红包API
2016/06/01 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
ie6下png图片背景不透明的解决办法使用js实现
2013/01/11 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
javascript实现依次输入input自动定焦
2014/12/23 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
详解JavaScript的闭包、IIFE、apply、函数与对象
2016/12/21 Javascript
基于JS实现仿百度百家主页的轮播图效果
2017/03/06 Javascript
JavaScript中splice与slice的区别
2017/05/09 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
如何快速解决JS或Jquery ajax异步跨域的问题
2018/01/08 jQuery
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
vue项目配置 webpack-obfuscator 进行代码加密混淆的实现
2021/02/26 Vue.js
Python ORM框架SQLAlchemy学习笔记之数据添加和事务回滚介绍
2014/06/10 Python
python通过socket实现多个连接并实现ssh功能详解
2017/11/08 Python
Python数据结构与算法之使用队列解决小猫钓鱼问题
2017/12/14 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
python 计算平均平方误差(MSE)的实例
2019/06/29 Python
Flask框架模板渲染操作简单示例
2019/07/31 Python
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
解决python 在for循环并且pop数组的时候会跳过某些元素的问题
2020/12/11 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
浅谈利用缓存来优化HTML5 Canvas程序的性能
2015/05/12 HTML / CSS
Loreto Gallo英国:欧洲领先的在线药房
2021/01/21 全球购物
如何在发生故障的节点上重新安装 SQL Server
2013/03/14 面试题
文明学生事迹材料
2014/01/29 职场文书
安全生产责任书
2014/03/12 职场文书
毕业生如何写自我鉴定
2014/03/15 职场文书
销售求职信范文
2014/05/26 职场文书
离婚协议书范本
2015/01/26 职场文书
幼儿园父亲节活动总结
2015/02/12 职场文书
清明节文明祭祀倡议书
2015/04/28 职场文书
详解nginx进程锁的实现
2021/06/14 Servers
python​格式化字符串
2022/04/20 Python