Python内建模块struct实例详解
什么是struct模块
struct模块是Python内建的一个用于处理二进制数据的模块。它提供了一种专门用于处理C语言中的结构体(structure)和其他二进制数据类型(如字符串、整型、浮点型等)的方法,可以帮助我们将一个Python对象转换为二进制数据流,或从二进制数据流中解析出Python对象。
struct模块的用法
struct模块主要有两个核心函数,分别是pack()
和unpack()
,它们分别用于将Python对象打包为一个二进制数据流(序列化),和从二进制数据流中解析出Python对象(反序列化)。
pack函数
pack(fmt, v1, v2, ...)
用于将变量v1, v2, ...按照指定的格式(fmt
)打包成一个二进制字符串(bytes类型),并返回打包后的数据。其中,fmt参数表示打包的格式,它由一系列格式化字符和数字所组成。
格式化字符和数字的含义如下:
字符 | 对应类型 | 字节数 |
---|---|---|
x |
填充字节 | 1 |
c |
字符型 | 1 |
b |
有符号字节型 | 1 |
B |
无符号字节型 | 1 |
? |
布尔型 | 1 |
h |
有符号短整型 | 2 |
H |
无符号短整型 | 2 |
i |
有符号整型 | 4 |
I |
无符号整型 | 4 |
l |
有符号长整型 | 4 |
L |
无符号长整型 | 4 |
q |
有符号长长整型 | 8 |
Q |
无符号长长整型 | 8 |
f |
单精度浮点型 | 4 |
d |
双精度浮点型 | 8 |
s |
字符串 | 无固定长度 |
p |
经过编码的字符串 | 无固定长度 |
P |
指针(无符号长整型) | 与机器有关 |
下面给出一个例子,展示如何使用pack()
函数将一个Python对象打包为一个二进制数据流。
import struct
# 打包一个字符串、一个整数和一个浮点数
packed_data = struct.pack('5sif', b'hello', 123, 3.14)
print(packed_data) # b'hello\x00{\x00\x00\x80?\x00\x00\x80?'
在这个例子中,我们将一个字符串(b'hello'
)、一个整数(123)和一个浮点数(3.14)打包成了一个二进制数据流,它们的格式为'5sif'
。其中,'5s'
表示5个字节长的字符串(字符串末尾会自动补\x00
),'i'
表示整数,'f'
表示浮点数。
unpack函数
unpack(fmt, string)
用于将二进制字符串(string
参数)按照指定的格式(fmt
)解包,并将解包后的数据以元组形式返回。
下面给出一个例子,展示如何使用unpack()
函数从一个二进制数据流中解析出Python对象。
import struct
# 解包一个字符串、一个整数和一个浮点数
packed_data = b'hello\x00{\x00\x00\x80?\x00\x00\x80?'
unpacked_data = struct.unpack('5sif', packed_data)
print(unpacked_data) # (b'hello', 123, 3.140000104904175)
在这个例子中,我们将一个二进制数据流(b'hello\x00{\x00\x00\x80?\x00\x00\x80?'
)按照格式'5sif'
进行解析,得到一个元组(b'hello', 123, 3.14)
。
示例说明
示例1:打包一个字典,并将其保存到文件中
import struct
# 定义一个字典
data = {
'username': 'john',
'age': 21,
'height': 1.75
}
# 打包字典
packed_data = struct.pack('5si2f', b'john\00', 21, 1.75, 0)
# 将二进制数据保存到文件中
with open('data.dat', 'wb') as f:
f.write(packed_data)
在这个例子中,我们定义了一个字典data
,并将其打包成一个二进制数据流(packed_data
)。我们使用了'\00'
这个字符来分隔字符串,因为在C语言中,字符串是以'\00'
作为结束标志的。然后,我们将打包后的二进制数据写入了一个文件data.dat
中。
示例2:从文件中读取二进制数据,并解析出字典
import struct
# 从文件中读取二进制数据
with open('data.dat', 'rb') as f:
packed_data = f.read()
# 解包二进制数据
unpacked_data = struct.unpack('5si2f', packed_data)
username = unpacked_data[0].decode('utf-8')
age = unpacked_data[1]
height = unpacked_data[2]
# 将元组转换成字典
data = {
'username': username,
'age': age,
'height': height
}
print(data) # {'username': 'john', 'age': 21, 'height': 1.75}
在这个例子中,我们从文件data.dat
中读取了一个二进制数据,然后使用unpack()
函数将其解包成一个元组(unpacked_data
)。由于打包时使用了'5s'
格式,所以解包后的第一个元素是一个5个字节长的字符串(unpacked_data[0]
),我们需要使用decode()
方法将其转换为字符串。最后,我们将元组转换成了一个字典data
,并输出了其内容。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python内建模块struct实例详解 - Python技术站