深入浅析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 29 Python
基于Django filter中用contains和icontains的区别(详解)
Dec 12 Python
详解appium+python 启动一个app步骤
Dec 20 Python
使用Python微信库itchat获得好友和群组已撤回的消息
Jun 24 Python
python pandas读取csv后,获取列标签的方法
Nov 12 Python
在Python中字典根据多项规则排序的方法
Jan 21 Python
在tensorflow中设置保存checkpoint的最大数量实例
Jan 21 Python
解决Python图形界面中设置尺寸的问题
Mar 05 Python
python编写一个会算账的脚本的示例代码
Jun 02 Python
python爬虫快速响应服务器的做法
Nov 24 Python
在 Golang 中实现 Cache::remember 方法详解
Mar 30 Python
用python修改excel表某一列内容的操作方法
Jun 11 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 使用file_get_contents读取大文件的方法
2014/11/13 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
浅谈php数组array_change_key_case() 函数和array_chunk()函数
2016/10/22 PHP
让whoops帮我们告别ThinkPHP6的异常页面
2020/03/02 PHP
Dom 是什么的详细说明
2010/10/25 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
关于js new Date() 出现NaN 的分析
2012/10/23 Javascript
Javascript模块化编程(三)require.js的用法及功能介绍
2013/01/17 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
js与C#进行时间戳转换
2014/11/14 Javascript
全面了解构造函数继承关键apply call
2016/07/26 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
实现一个Vue自定义指令懒加载的方法示例
2020/06/04 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
Python科学画图代码分享
2017/11/29 Python
python数据抓取分析的示例代码(python + mongodb)
2017/12/25 Python
python使用锁访问共享变量实例解析
2018/02/08 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
django数据模型(Model)的字段类型解析
2019/12/25 Python
Python Socketserver实现FTP文件上传下载代码实例
2020/03/27 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
2020/05/10 Python
Jones Bootmaker官网:优质靴子和鞋子在线
2020/11/30 全球购物
财务分析个人的自荐书范文
2013/11/24 职场文书
如何撰写岗位职责
2014/02/01 职场文书
简历的自我评价范文
2014/02/04 职场文书
高一数学教学反思
2014/02/07 职场文书
完整版商业计划书
2014/09/15 职场文书
列车乘务员工作不细心检讨书
2014/10/07 职场文书
解除劳动合同证明书模板
2014/11/20 职场文书
2014年质量工作总结
2014/11/22 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
明星邀请函
2015/02/02 职场文书
安全生产会议制度
2015/08/06 职场文书
2016年大学生党员承诺书
2016/03/24 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python