python常用内建模块:struct
struct
是 Python 中的一个内建模块,用于处理 C 语言结构体与 Python 数据类型之间的转换。它允许你将 Python 中的数据打包成二进制格式,或者将二进制数据解包成 Python 数据类型。这在处理二进制数据(如网络通信、文件读写等)时非常有用。
基本用法
打包(Packing)
使用 struct.pack
方法将 Python 数据类型转换为二进制数据。struct.pack
的第一个参数是一个格式字符串,用于指定要打包的数据的类型和顺序;后面的参数是要打包的数据。
格式字符串由多个字符组成,每个字符表示一个数据类型。例如:
c
:字符(1 字节)b
:有符号字符(1 字节)B
:无符号字符(1 字节)h
:短整型(2 字节)H
:无符号短整型(2 字节)i
:整型(4 字节)I
:无符号整型(4 字节)f
:浮点型(4 字节)d
:双精度浮点型(8 字节)
还有一些用于指定字节顺序和字节大小的修饰符,如:
@
:原生字节顺序(默认)=
:标准字节顺序(默认)<
:小端字节顺序(最低有效字节在前)>
:大端字节顺序(最高有效字节在前)!
:网络字节顺序(大端)s
:字符串(前面必须指定长度)p
:指针(用于内部表示)x
:填充字节(不占用任何存储空间)
示例:
python复制代码
import struct | |
# 将两个整数打包成二进制数据 | |
packed_data = struct.pack('ii', 1, 2) | |
print(packed_data) # 输出:b'\x01\x00\x00\x00\x02\x00\x00\x00' |
解包(Unpacking)
使用 struct.unpack
方法将二进制数据解包成 Python 数据类型。struct.unpack
的第一个参数是格式字符串,后面是要解包的二进制数据(通常是字节对象)。
示例:
python复制代码
import struct | |
# 之前打包的二进制数据 | |
packed_data = b'\x01\x00\x00\x00\x02\x00\x00\x00' | |
# 解包二进制数据 | |
unpacked_data = struct.unpack('ii', packed_data) | |
print(unpacked_data) # 输出:(1, 2) |
计算大小(Calculating Size)
使用 struct.calcsize
方法可以计算格式字符串指定的数据在内存中的大小(以字节为单位)。
示例:
python复制代码
import struct | |
# 计算两个整型数据在内存中的大小 | |
size = struct.calcsize('ii') | |
print(size) # 输出:8 |
示例应用
假设你有一个包含多个整数和浮点数的二进制文件,你可以使用 struct
模块来读取和写入这个文件。
写入二进制文件
python复制代码
import struct | |
# 要写入的数据 | |
data = [(1, 2.5), (3, 4.5), (5, 6.5)] | |
# 打开文件用于二进制写入 | |
with open('data.bin', 'wb') as f: | |
for item in data: | |
# 打包数据并写入文件 | |
packed_item = struct.pack('if', *item) | |
f.write(packed_item) |
读取二进制文件
python复制代码
import struct | |
# 打开文件用于二进制读取 | |
with open('data.bin', 'rb') as f: | |
# 计算每条记录的大小 | |
record_size = struct.calcsize('if') | |
# 读取文件中的所有记录 | |
data = [] | |
while True: | |
# 从文件中读取一条记录 | |
record = f.read(record_size) | |
if not record: | |
break | |
# 解包记录并添加到列表中 | |
unpacked_record = struct.unpack('if', record) | |
data.append(unpacked_record) | |
print(data) # 输出:[(1, 2.5), (3, 4.5), (5, 6.5)] |
struct
模块非常强大,适用于各种需要处理二进制数据的场景。通过掌握它的用法,你可以更有效地处理网络通信、文件读写等任务。