Python 内置模块之 bytes

官方文档:https://docs.python.org/zh-cn/3.8/library/argparse.html

0、bytes类型的特性

Python 3.x之后,Python自带字符默认使用utf-8格式编码和显示:

  • Python默认字符串string数据类型是utf-8显示形式的序列
  • bytes数据类型是utf-8格式的二进制形式的不可变序列
  • bytearray数据类型是utf-8格式的二进制形式的可变序列

1、bytes 语法

bytes 函数返回一个新的 bytes 对象,该对象是一个 0 <= x < 256 区间内的整数不可变序列。它是 bytearray 的不可变版本。

语法

1
class bytes([source[, encoding[, errors]]])

参数

  • 如果 source 为整数,则返回一个长度为 source 的初始化数组;
  • 如果 source 为字符串,则按照指定的 encoding 将字符串转换为字节序列;
  • 如果 source 为可迭代类型,则元素必须为[0 ,255] 中的整数;
  • 如果 source 为与 buffer 接口一致的对象,则此对象也可以被用于初始化 bytearray。
  • 如果没有输入任何参数,默认就是初始化数组为0个元素。

返回值

返回一个新的 bytes 对象。

2、bytes类型创建与转化

2.1、bytes类型与数字

数字类型并不是字符串,无法直接生成对应的bytes类。Python对数字类型定义了特殊意义

  1. 当入参为数字时,表示创建nul(\x00)的向量

    1
    2
    byte_str = bytes(10)
    print(byte_str) # b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
  2. 当入参为数字的序列时,直接转为bytes的序列,且对应值相同,将数字序列直接写入底层应该使用这种方法

    1
    2
    byte_str = bytes([1, 10, 0xF])
    print(byte_str) # b'\x00\x10\x0f'
  3. 当二进制数据在[33, 126] 区间时,属于ASCII表上可显示字符范围,会直接显示对应的字符

    1
    2
    byte_str = bytes([33, 48, 126])
    print(byte_str) # b'!0~'

2.2、bytes类型与ASCII字符

创建bytes数据

  1. 使用b''创建

    1
    2
    byte_str = b'Python'
    print(byte_str) # b'Python'
  2. 使用bytes()创建不可变序列

    1
    2
    byte_str = bytes('Python', encoding='utf-8')
    print(byte_str) # b'Python'
  3. 使用bytearray()创建可变序列

    1
    2
    byte_str = bytearray('Python', encoding='utf-8')
    print(byte_str) # bytearray(b'Python')

还原bytes数据

  1. 使用bytes.decode()还原不可变序列

    1
    2
    3
    byte_str = bytes('Python', encoding='utf-8')
    utf_str = bytes.decode(byte_str)
    print(utf_str) # 'Python'
  2. 使用bytearray.decode()还原可变序列

    1
    2
    3
    byte_str = bytearray('Python', encoding='utf-8')
    utf_str = bytearray.decode(byte_str)
    print(utf_str) # 'Python'

2.3、bytes类型与汉字

在UTF-8中,每个汉字用3个Byte表示

1
2
byte_str = bytes('我是', encoding='utf-8')
print(byte_str) # b'\xe6\x88\x91\xe6\x98\xaf'

还原:

1
2
3
byte_str = b'\xe6\x88\x91\xe6\x98\xaf'
utf_str = bytes.decode(byte_str)
print(utf_str) # '我是'

3 bytes类型切片迭代

  1. 通过bytes[index]方式返回的是底层int类型

    1
    2
    3
    byte_str = b'a'
    print(type(byte_str[0])) # <class 'int'>
    print(byte_str[0]) # 97
  2. 通过for ... in bytes方式返回的是底层int类型

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    byte_str = b'abc'
    for byte in byte_str:
    print(type(byte))
    print(byte)

    """
    <class 'int'>
    97
    <class 'int'>
    98
    <class 'int'>
    99
    """
  3. 通过bytes[start:end]方式返回的是底层bytes类型

    1
    2
    3
    byte_str = b'a'
    print(type(byte_str[:])) # <class 'bytes'>
    print(byte_str[:]) # b'a'

Python 内置模块之 bytes
https://flepeng.github.io/021-Python-31-Python-标准库-Python-标准库之-bytes-二进制/
作者
Lepeng
发布于
2021年3月17日
许可协议