深入浅析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正常时间和unix时间戳相互转换的方法
Apr 23 Python
Python实现视频下载功能
Mar 14 Python
对IPython交互模式下的退出方法详解
Feb 16 Python
详解python读取image
Apr 03 Python
python按比例随机切分数据的实现
Jul 11 Python
Python实现最常见加密方式详解
Jul 13 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
Python 静态方法和类方法实例分析
Nov 21 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
Python pip安装第三方库实现过程解析
Jul 09 Python
python简单实现插入排序实例代码
Dec 16 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 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中批量修改文件后缀名的函数代码
2011/10/23 PHP
PHP 文件系统详解
2012/09/13 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
详解PHP中的PDO类
2015/07/06 PHP
CI框架出现mysql数据库连接资源无法释放的解决方法
2016/05/17 PHP
JavaScript面向对象之静态与非静态类
2010/02/03 Javascript
DIV菜单层实现代码
2010/11/19 Javascript
javascript中substr,substring,slice.splice的区别说明
2010/11/25 Javascript
jQuery动画效果-fadeIn fadeOut淡入浅出示例代码
2013/08/28 Javascript
javascript特殊用法示例介绍
2013/11/29 Javascript
js分页代码分享
2014/04/28 Javascript
jQuery.lazyload+masonry改良图片瀑布流代码
2014/06/20 Javascript
JavaScript验证电子邮箱的函数
2014/08/22 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
2015/03/24 Javascript
jQuery菜单插件superfish使用指南
2015/04/21 Javascript
jquery特效 点击展示与隐藏全文
2015/12/09 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
跨域解决之JSONP和CORS的详细介绍
2018/11/21 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
Python模拟脉冲星伪信号频率实例代码
2018/01/03 Python
python Spyder界面无法打开的解决方法
2018/04/27 Python
详解Python如何生成词云的方法
2018/06/01 Python
Python设计模式之策略模式实例详解
2019/01/21 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
Python程序慢的重要原因
2020/09/04 Python
html5+css3进度条倒计时动画特效代码【推荐】
2016/03/08 HTML / CSS
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
Hotels.com越南:酒店预订
2019/10/29 全球购物
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
房地产广告策划方案
2014/05/15 职场文书
个人授权委托书格式
2014/08/30 职场文书
Django数据库(SQlite)基本入门使用教程
2022/07/07 Python