Python字符串前'b'字符的作用解析

Python字符串前’b’字符的作用解析

技术背景

在Python中,字符串是常用的数据类型之一。在Python 3.x中,对文本和二进制数据做了明确区分。str 类型用于表示文本,是一系列字符的序列;而 bytes 类型用于表示二进制数据,是一系列字节的序列。b 字符正是用于创建 bytes 类型的字符串字面量。

实现步骤

1. 理解 strbytes 类型

在Python 3.x中:

  • str:使用 '...'"..." 定义,代表一系列字符。字符是文本的基本单位,如字母、数字、标点等。Unicode标准为每个字符分配一个整数码点。
  • bytes:使用 b'...' 定义,代表一系列字节。一个字节是计算机上可寻址的最小整数类型,通常为8位,取值范围是0 - 255。

示例代码:

1
2
3
4
5
6
7
# str 类型
str_example = 'שלום עולם'
print(type(str_example))

# bytes 类型
bytes_example = b'Hello'
print(type(bytes_example))

2. 字符串和字节类型的转换

  • 编码(encode:将 str 类型转换为 bytes 类型。
1
2
str_to_bytes = '€'.encode('UTF-8')
print(str_to_bytes) # 输出: b'\xe2\x82\xac'
  • 解码(decode:将 bytes 类型转换为 str 类型。
1
2
bytes_to_str = b'\xe2\x82\xac'.decode('UTF-8')
print(bytes_to_str) # 输出: €

3. 避免类型混合

strbytes 类型不能直接混合使用,否则会引发 TypeError 异常。

1
2
3
4
try:
result = b'\xef\xbb\xbf' + 'Text with a UTF-8 BOM'
except TypeError as e:
print(f"Error: {e}")

4. 在Python 2.x中的情况

Python 2.x 版本缺乏文本和二进制数据的明确区分。unicode 类型对应 Python 3.x 的 str 类型,而 str 类型既可以表示文本,也可以表示二进制数据。为了便于从 2.x 迁移到 3.x,b'...' 字面量语法被回推到 Python 2.6 中。在 2.x 中,b 前缀没有实际作用,但可以告诉 2to3 脚本不要将其转换为 Unicode 字符串。

5. 其他字符串前缀

  • r 前缀:创建原始字符串,其中的反斜杠不会被解释。
1
2
raw_string = r'\t'
print(raw_string) # 输出: \t
  • f 前缀(Python 3.6 引入):创建格式化字符串,可以引用 Python 变量。
1
2
3
name = 'John'
formatted_string = f'My name is {name}.'
print(formatted_string) # 输出: My name is John.

核心代码

发送和接收数据时处理 bytes 类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 服务器端代码
import socket

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8888))
server_socket.listen(1)

print('Waiting for connection...')
conn, addr = server_socket.accept()
print(f'Connected by {addr}')

stri = "Response from server"
conn.send(stri.encode())

conn.close()

# 客户端代码
import socket

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8888))

data = client_socket.recv(1024)
print(data.decode())

client_socket.close()

使用 JSON 处理 bytes 类型

1
2
3
4
5
import json

data = b'{"key": "value"}'
result = json.loads(data)
print(result) # 输出: {'key': 'value'}

最佳实践

  • 当处理文本时,优先使用 str 类型。
  • 当处理底层二进制数据,如文件读写、网络传输时,使用 bytes 类型。
  • 在进行字符串和字节类型转换时,明确指定编码方式,通常使用 UTF-8。

常见问题

1. 如何去掉 b'...' 前缀?

使用 decode() 方法将 bytes 类型转换为 str 类型。

1
2
3
bytes_data = b'Hello'
str_data = bytes_data.decode()
print(str_data) # 输出: Hello

2. 为什么不能直接将 strbytes 类型相加?

因为它们是不同的数据类型,不能直接混合使用。需要先进行类型转换。

3. 在读取文件时,如何正确处理 bytes 类型?

如果文件是以二进制模式打开('rb'),读取的数据是 bytes 类型。如果需要将其作为文本处理,需要进行解码。

1
2
3
4
with open('example.txt', 'rb') as file:
binary_data = file.read()
text_data = binary_data.decode('UTF-8')
print(text_data)

Python字符串前'b'字符的作用解析
https://119291.xyz/posts/python-string-b-prefix-explanation/
作者
ww
发布于
2025年7月17日
许可协议