Python bytes类型,str类型在Python 3和Python 2中是相同的
本文主要介绍Python3中的bytes类型和str类型。bytes是一个比特流,两者的关系是Python内置了一个函数bytes(),可以将str类型转换为bytes类型。以下更多详情,请参考各位朋友。
00-1010前言:编码发展史bytes和str的异同
目录
Python最重要的新特性之一是,它明确区分了字符串和二进制数据流。文本总是Unicode,用str类型表示,二进制数据用bytes类型表示。Python不以任何隐含方式混合字符串和字节。不能拼接字符串和字节流,不能在字节流中搜索字符串(反之亦然),也不能将字符串传递给参数为字节流的函数(反之亦然)。
下面我们来深入分析一下它们之间的区别和联系。
前言:
在我们谈论字节和str之前,我们需要谈论编码是如何发展的。
在计算机历史的早期,以美国为代表的英语国家主导了整个计算机行业,26个英文字母组成了各种英语单词、句子和文章。所以最早的字符编码标准是ASCII码,8位编码标准,意思是1个字节,可以覆盖整个英文系的编码需求。
代码是什么?编码是用二进制来表示一个字符。众所周知,所有的东西,不管是英文、中文还是符号,最后都是作为01010101存储在磁盘上的。在计算机内部,读取和存储数据,归根结底是由0和1组成的比特流。问题来了。人类无法理解这些比特流。如何才能让这些010101对人类可读?于是字符编码出现了。它是一个翻译器,在计算机内部的某个地方,它透明地帮助我们将比特流翻译成人类可以直接理解的文字。对于普通用户来说,不需要知道这个过程的原理是什么,如何执行。但是对于程序员来说,是一个必须要搞清楚的问题。
以ASCII编码为例,它规定一个字节的8位代表一个字符的编码,即“0000000”宽到可以一次解释一个字节。比如01000001代表大写字母A,有时候我们会“懒”用十进制数65来代表ASCII码中A的编码。8位,可以不重复地表示2的8次方(255)个字符。
后来电脑普及了,中、日、韩等国的文字都需要用电脑来表现。ASCII的255位远远不够,于是标准组织制定了一个叫UNICODE的通用代码,规定任何字符(无论哪个国家)都要用至少2个字节来表示,可以更多。其中英文字母用2字节,汉字用3字节。这段代码虽然很好,符合大家的要求,但是不兼容ASCII,而且占用空间和内存也比较大。因为,在计算机的世界里,更多的字符是英文字母,显然可以用一个字节来表示,两个字符是必须的。
于是UTF-8编码应运而生,它规定英文字母序列用一个字节表示,汉字用三个字节表示等等。所以兼容ASCII,可以解码早期文档。UTF-8很快被广泛使用。
在编码发展过程中,中国也创造了自己的编码方法,如GBK、GB2312和BIG5。它们仅限于国内使用,在国外不被认可。在GBK编码中,汉字占2个字节。
编码发展的历史
回到字节和字符串。Bytes是一个比特流,它的现有形式是0101001110。无论我们在写代码还是读文章的时候,没有人会直接读这个比特流。它必须有一种编码方式,使之成为有意义的比特流,而不是一堆晦涩难懂的01组合。由于编码方式的不同,对这个比特流的解读也会有所不同,这给实际使用带来了很大的麻烦。
下面让我们看看Python是如何处理这一系列编码问题的:
S=中文
s
中国人
类型
类别“str”
b=字节(s,编码=utf-8 )
b
bxe4xb8xadxe6x96x87
类型(b)
类字节
从例子中可以看出,s是一个字符串类型。Python有一个内置的函数bytes(),可以将字符串str类型转换为bytes类型。b实际上是01的组合,但对于我们在ide环境下相对直观的观察来说,它是以bxe4xb8xadxe6x96x87 的形式表示的。开头的b表示它是字节类型。
xe4是十六进制表示。
方式,它占用1个字节的长度,因此中文被编码成utf-8后,我们可以数得出一共用了6个字节,每个汉字占用3个,这印证了上面的论述。在使用内置函数bytes()的时候,必须明确encoding的参数,不可省略。
我们都知道,字符串类str里有一个encode()方法,它是从字符串向比特流的编码过程。而bytes类型恰好有个decode()
方法,它是从比特流向字符串解码的过程。除此之外,我们查看Python源码会发现bytes和str拥有几乎一模一样的方法列表,最大的区别就是encode和decode。
从实质上来说,字符串在磁盘上的保存形式也是01的组合,也需要编码解码。
如果,上面的阐述还不能让你搞清楚两者的区别,那么记住下面两几句话:
在将字符串存入磁盘和从磁盘读取字符串的过程中,Python自动地帮你完成了编码和解码的工作,你不需要关心它的过程。
使用bytes类型,实质上是告诉Python,不需要它帮你自动地完成编码和解码的工作,而是用户自己手动进行,并指定编码格式。
Python已经严格区分了bytes和str两种数据类型,你不能在需要bytes类型参数的时候使用str参数,反之亦然。这点在读写磁盘文件时容易碰到。
在bytes和str的互相转换过程中,实际就是编码解码的过程,必须显式地指定编码格式。
>>> b
我们再把字符串s1,转换成gbk编码的bytes类型:
>>> s1
到此这篇关于Python3中的bytes类型和str类型的文章就介绍到这了,更多相关Python bytes和str内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。