Python数据类型之字节串(Bytes)

发布时间 2023-09-14 15:05:47作者: joudys

Python中的字节串类型(bytes)是在Python 3.0版本中新增的类型。在Python 2.x版本中,字节串类型被称为字符串类型(str),但在Python 3.0中,字符串类型被重命名为文本字符串类型(str),而字节串类型被引入并命名为bytes。
字节串类型用于表示二进制数据,可以包含任何字节值,包括ASCII字符和非ASCII字符。在Python 3.0中,字节串类型和文本字符串类型被明确区分,这使得处理二进制数据和文本数据更加灵活和方便。
由于 bytes 保存的就是原始的字节(二进制格式)数据,因此 bytes 对象可用于在网络上传输数据,也可用于存储各种二进制格式的文件,比如图片、音乐等文件。

知识先导

  1. 字节概念

    字节(Byte )是计算机用于计量存储容量和传输容量的一种计量单位。一个字节等于8位二进制数,也就是8位(bit),即它包含八位的二进制数。在计算机中,数据存储和传输都是以字节为单位进行的。

    位(bit):是计算机 内部数据 储存的最小单位,1bit代表1位二进制数,其值要么是0,要么是1。11001100是一个八位二进制数;

    字节(byte):是计算机中 数据处理 的基本单位,习惯上用大写 B 来表示,1B(byte,字节)= 8bit(位)

  2. 字符概念

    字符 是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%……—*()——+等等。在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3个字节。转换为bit(位)来计算, 一个英文就用八位二进制数表示,一个汉字就用3个八位二进制数表示。

  3. 字符串概念

    字符串 是字符序列,它是一种抽象的概念,不能直接存储在硬盘。在存储时,需要将字符串中的每个字符转换为字节,然后进行存储。

  4. 字节串概念

    字节串 是字节序列,它可以直接存储在硬盘。它们之间的映射被称为编码/解码

    在Python中,程序中的文本都用字符串表示。

    在字节串中每个数据单元都是字节,也就是 8 位,其中每 4 位(相当于 4 位二进制数,最小值为 0 ,最大值为 15)可以用一个十六进制数来表示,因此每字节需要两个十六进制数表示,

    b'\xe6\x88\x91\xe7\x88\xb1Python\xe7\xbc\x96\xe7\xa8\x8b',
    # 比如 :\xe6 就表示 1 字节,其中 \x 表示十六进制,e6 就是两位的十六进制数。 
    

字节串与字符串之间的区别

bytes 和 str 除操作的数据单元不同之外,它们支持的所有方法都基本相同,bytes 也是不可变序列。

  1. 字符串(str)由多个字符组成,以字符为单位进行操作;
  2. 字节串(bytes)由多个字节组成,以字节为单位进行操作。

字节串创建

创建字符串,主要有如下三种方式:

  1. 如果字符串内容都是 ASCII 字符,则可以通过直接在字符串之前添加 b 来构建字节串值。

        # 创建一个空的bytes
        b1 = bytes()
        print(b1) # b''
        print(type(b1)) # <class 'bytes'>
        # 创建一个空的bytes值,等同于 b''
        b2 = b''
        print(b2) # b''
        print(type(b2)) # <class 'bytes'>
        # 创建非空字节串值,通过b前缀指定hello是bytes类型的值
        b3 = b'hello'
        print(b3) # b'hello'
        # ASCII编码中 h对应的十进制编码为104
        print(b3[0]) # 104
        print(b3[2:4]) # b'll'
    
        # ASCII编码 十六进制A,B分别对应41,42,\x代表十六进制
        b = b'\x41\x42'
        print(b) # b'AB'
    
  2. 调用 bytes() 函数(其实是 bytes 的构造函数)将字符串按指定字符集转换成字节串,如果不指定字符集,默认使用 UTF-8 字符集。

    • bytes() 生成一个空的字节串 等同于 b'';
    • bytes(整型可迭代对象) 用可迭代对象初始化一个字节串,不能超过255;
    • bytes(整数n) 生成 n 个值为零的字节串;
    • bytes(字符串, encoding='utf-8') 用字符串的转换编码生成一个字节串;
    # 创建一个空的bytes
    b = bytes()
    print(b1) # b''
    
    b2 = bytes(range(65,65+26))
    print(b2) # b'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    
    b1 = bytes(5)
    print(b1)# b'\x00\x00\x00\x00\x00'
    
    # `hello`中的字符属于ASCII编码集,`中国`不属于ASCII编码集,根据UTF-8编码规则,一个中文字符由3字节表示
    b = bytes('hello,中国', encoding='UTF-8')
    print(b) #b'hello,\xe4\xb8\xad\xe5\x9b\xbd'
    
  3. 调用字符串本身的encode() 方法将字符串按指定字符集转换成字节串(常用)。如果不指定字符集,默认使用 UTF-8 字符集。

    s = 'hello,中国!'
    b = s.encode(encoding='UTF-8')
    print(b) #b'hello,\xe4\xb8\xad\xe5\x9b\xbd\xef\xbc\x81'
    

字符串和字节串转化

  • 字符串(str)编码为字节串(bytes)

    b = s.encode('utf-8')

  • 字节串(bytes)解码为字符串(str)

    s = b.decode('utf-8')

s = 'hello,中国!'
b = s.encode(encoding='UTF-8')
print(b) #b'hello,\xe4\xb8\xad\xe5\x9b\xbd\xef\xbc\x81'

s1 = b.decode(encoding='utf-8')
print(s1) #hello,中国!

参考文章

Python中字节串和字符串,不是一个概念没有区别之分_AllardZhao的博客-CSDN博客

Python(00):bytes字节串类型及用法 - springsnow - 博客园 (cnblogs.com)

[Python之字节串 - 简书 (jianshu.com)](