深入浅析python3中的unicode和bytes问题
作者:虞大胆 发布时间:2022-11-29 02:41:47
最近写了一些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问题,网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://mp.weixin.qq.com/s
猜你喜欢
- tensorflow中tf.concat的axis的使用我一直理解的比较模糊,这次做个笔记理下自己的思路。import tensorflow
- 查看某一列中有多少中取值:数据集名.drop_duplicates(['列名'])#实际为删除重复项,删除后对原数据集不修改
- 大多的MySQL都是装在Linux上的,而我们的本机上一般都会装MySQL-Front.那如何用MySQL-Front连接远端Linux系统
- 引入Gridgrid=Grid() # 可以分别调整上下左右的位置,可以是百分比,也可以是具体像素,如pos_top="50px&
- 主要记录一下:图片验证码1.获取登录界面的图片2.获取验证码位置3.在登录页面截取验证码保存4.调用百度api识别(目前准确率较高的识别图片
- 事先在网上搜索了一大圈,头都大了,看到那么多文章写道在python里安装psycopg2的各种坑和各种麻烦,各种不成功。搜索了一下午,索性外
- Request Payload 和 Form Data 请求头上的参数差别在于:Content-TypeForm DataPost表单请求代
- 网上存在这么一个例子 obj = pd.Series([7,-5,7,4,2,0,4])obj.rank()输出为:0 6.51
- JS获取网页中HTML元素的几种方法分析:getElementById getElementsByName getElementsByTag
- 注意:使用该方法,获取的数据总数目不能超过1万,否则出错#在python3上运行from elasticsearch import Elas
- 问题:安装lightgbm成功后,无法在anaconda jupyter notebook中导入lightgbm包原因:lightgbm默认
- 为了把事情变成简单化,我在多个Oracle数据上建立统一的检查数据库账户,并且账户只能访问特定的几个视图(需要查询的sql已生成视图),具体
- 1. PHP入侵检测系统PHP IDS(即PHP-入侵检测系统)是一套易于使用、结构良好、速度出色且专门面向PHP类Web应用程序的先进安全
- 质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。一、判断一个数是否为素数:基于定义def
- 事物绝非十全十美总有强差人意的一面,之前针对浮动分析了其引起文本重影的怪异问题,而作为浮动布局的最佳搭档定位布局也存在一定的缺陷。围绕着定位
- 数制转换即进制转换,指进制(二、八、十、十六进制)间的相互转换,计算机编程中较为常见。这里列举了python常见数制转换用法。1.进位制度P
- 我们在爬虫时,经常会遇见中文乱码问题,之前都是编码格式的问题,很少遇见由于压缩格式造成的编码混乱问题,特记录下。先看下混乱的编码样式。b
- 前言将Selenium程序编写为 .bat 可执行文件,从此一键启动封装好的Selenium程序,省时省力还可以复用,岂不美哉应用场景写好
- 最近用了pycharm,感觉还不错,就是pandas中Series、DataFrame的plot()方法不显示图片就给我结束了,但是我在ip
- 大家好,今天我们要看看如何用 Python制作音乐播放器。此音乐播放器播放您的歌曲,您可以在播放歌曲时暂停、恢复、设置音量,然后您可以停止音