ZetCode

Python 字节

最后修改于 2024 年 1 月 29 日

在本文中,我们将展示如何在 Python 中使用字节类型。

bytes 类型是不可变的字节序列。该序列由 0 到 255 范围内的整数组成。此数据类型用于存储数据和数据传输。

当我们打开网络套接字、处理串行 I/O 或打开二进制文件时,我们使用 bytes 类型。

Python 有一个可变的等效于 bytes 类型的类型,称为 bytearray

字节字符串是字节类型的人类可读表示形式。它由两个单引号、双引号或三引号之间的一系列 ASCII 字符组成。字节字符串以 b 字符为前缀。对于可打印的 ASCII 字符,使用相应的字符。对于换行符、制表符、回车符和 \ 字符,使用转义序列 \n、\t、\r 和 \\。对于任何其他值,使用十六进制转义序列,例如 \xc4\xc5

字节类型的每个单个元素都是一个整数。 字节切片返回一个切片。

Python 字节示例

在第一个示例中,我们开始使用 bytes 类型。

main.py
#!/usr/bin/python

s = 'фальконет'
print(s)
print(len(s))

e = s.encode('utf8')
print(e)
print(len(e))

v = bytes('фальконет', 'utf8')
print(v)

w = b'\xd1\x84\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x82'
print(w)

print('-------------------------')

print(e.decode('utf8'))
print(v.decode('utf8'))
print(w.decode('utf8'))

在该示例中,我们定义一个 Unicode 字符串并将其转换为字节类型。然后,我们将其转换回 Unicode 字符串。

s = 'фальконет'
print(s)
print(len(s))

我们定义一个 Unicode 字符串,并打印它及其字符大小。

e = s.encode('utf8')
print(e)

我们将字符串编码为字节类型。

print(len(e))

我们打印字节字符串中的字节数。

v = bytes('фальконет', 'utf8')

我们可以使用内置的 bytes 函数获取字节类型。

w = b'\xd1\x84\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x82'
print(w)

我们定义一个字节字符串。

print(e.decode('utf8'))
print(v.decode('utf8'))
print(w.decode('utf8'))

这里我们将三个字节解码为 Unicode 字符串。

$ ./main.py
фальконет
9
b'\xd1\x84\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x82'
18
b'\xd1\x84\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x82'
b'\xd1\x84\xd0\xb0\xd0\xbb\xd1\x8c\xd0\xba\xd0\xbe\xd0\xbd\xd0\xb5\xd1\x82'
-------------------------
фальконет
фальконет
фальконет

Python 传输字节

网络上的数据以字节类型传输。

main.py
#!/usr/bin/python

import requests

url = 'http://webcode.me/small.txt'

req = requests.get(url)

print(req.content)
print(req.content.decode('utf8'))

我们生成对小型文本资源的 GET 请求。

print(req.content)

打印请求内容,我们得到一个字节字符串。

print(req.content.decode('utf8'))

我们使用 decode 将字节字符串转换为 Unicode 字符串。

$ ./main.py 
b'small text page\n'
small text page

Python 字节读取二进制

当我们以二进制模式打开文件时,我们以字节形式检索数据。

data.txt
Dnes bol krásny deň. 
Dážď bubnoval na okenice.

我们有这个文本文件。

main.py
#!/usr/bin/python

with open('data.txt', 'rb') as f:

    lines = f.readlines()

    print(lines)

    for line in lines:
        print(line.decode().rstrip())

我们以二进制模式读取文本文件。

with open('data.txt', 'rb') as f:

我们以 rb 模式打开文本文件。

lines = f.readlines()

我们获得一个字节字符串列表。

for line in lines:
    print(line.decode().rstrip())

我们遍历列表并打印解码后的行。

$ ./main.py 
[b'Dnes bol kr\xc3\xa1sny de\xc5\x88. \r\n', b'D\xc3\xa1\xc5\xbe\xc4\x8f bubnoval na okenice.']
Dnes bol krásny deň.
Dážď bubnoval na okenice.

Python 字节表示

在以下示例中,我们以不同的数字系统表示字节。

main.py
#!/usr/bin/python

from more_itertools import sliced

s = 'château'
print(s)

v = s.encode('utf8')
print(v)

h = v.hex()
print(h)

d = list(sliced(h, 2))
print(d)

i = int(h, 16)
b = bin(i)

print(i)
print(b)

print(bytes.fromhex(f'{int(b, 2):x}').decode('utf8'))

我们将法语单词 château 转换为字节类型。 然后以十六进制、整数和二进制值显示该类型。

s = 'château'
print(s)

我们定义一个 Unicode 字符串。

v = s.encode('utf8')
print(v)

该字符串被编码为字节字符串。

h = v.hex()
print(h)

我们将字节字符串转换为十六进制字符串。

d = list(sliced(h, 2))
print(d)

我们将十六进制字符串转换为十六进制值列表。

i = int(h, 16)

我们将十六进制字符串转换为整数。

b = bin(i)

十进制整数转换为二进制。

print(bytes.fromhex(f'{int(b, 2):x}').decode('utf8'))

我们将二进制转换回 Unicode 字符串。

$ ./main.py
château
b'ch\xc3\xa2teau'
6368c3a274656175
['63', '68', 'c3', 'a2', '74', '65', '61', '75']
7163190309837693301
0b110001101101000110000111010001001110100011001010110000101110101
château

来源

Python 内置类型

在本文中,我们使用了 Python 中的字节类型。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我从 2007 年开始撰写编程文章。到目前为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程