深入浅析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 相关文章推荐
pip 错误unused-command-line-argument-hard-error-in-future解决办法
Jun 01 Python
详解python的几种标准输出重定向方式
Aug 15 Python
Python 搭建Web站点之Web服务器网关接口
Nov 06 Python
python画折线图的程序
Jul 26 Python
Python实现的爬取百度文库功能示例
Feb 16 Python
详解如何设置Python环境变量?
May 13 Python
python实现五子棋小程序
Jun 18 Python
python的pyecharts绘制各种图表详细(附代码)
Nov 11 Python
python 字符串的驻留机制及优缺点
Jun 19 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
Python通过len函数返回对象长度
Oct 22 Python
GitHub上值得推荐的8个python 项目
Oct 30 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中使用Oracle数据库(2)
2006/10/09 PHP
从零开始学YII2框架(一)通过Composer安装Yii2框架
2014/08/20 PHP
PHP快速生成各种信息提示框的方法
2016/02/03 PHP
详解php中的implements 使用
2017/06/13 PHP
Laravel推荐使用的十个辅助函数
2019/05/10 PHP
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
2009/04/07 Javascript
Javascript 八进制转义字符(8进制)
2011/04/08 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
Jquery on方法绑定事件后执行多次的解决方法
2016/06/02 Javascript
angular中实现控制器之间传递参数的方式
2017/04/24 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
关于meta viewport中target-densitydpi属性详解(推荐)
2017/08/18 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
解决vue-router在同一个路由下切换,取不到变化的路由参数问题
2018/09/01 Javascript
React Native开发封装Toast与加载Loading组件示例
2018/09/08 Javascript
javascript面向对象创建对象的方式小结
2019/07/29 Javascript
js实现图片上传到服务器和回显
2020/01/19 Javascript
vue中watch和computed的区别与使用方法
2020/08/23 Javascript
Python3.2中Print函数用法实例详解
2015/05/19 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
2019/02/28 Python
python爬虫租房信息在地图上显示的方法
2019/05/13 Python
python实现KNN分类算法
2019/10/16 Python
python使用openCV遍历文件夹里所有视频文件并保存成图片
2020/01/14 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
2020/04/10 Python
英国时尚饰品和发饰购物网站:Claire’s
2017/07/04 全球购物
UNIX命令速查表
2012/03/10 面试题
分层教学实施方案
2014/03/19 职场文书
技术经济专业求职信
2014/09/03 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python
关于Python OS模块常用文件/目录函数详解
2021/07/01 Python
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL