在 Python 3.4 及更高版本中,您可以使用新函数struct.iter_unpack。
struct.iter_unpack(fmt, buffer)
根据格式字符串 fmt 从缓冲缓冲区中迭代解包。该函数返回一个迭代器,它将从缓冲区中读取相同大小的块,直到其所有内容都被消耗完。缓冲区的字节大小必须是格式所需大小的倍数,这由 calcsize() 反映。
每次迭代都会产生一个由格式字符串指定的元组。
假设我们想用重复格式字符串'<2sc'(2 个字符后跟一个字符,重复直到完成)解压数组b'\x01\x02\x03'*3。
使用iter_unpack,您可以执行以下操作:
>>> import struct
>>> some_bytes = b'\x01\x02\x03'*3
>>> fmt = '<2sc'
>>>
>>> tuple(struct.iter_unpack(fmt, some_bytes))
((b'\x01\x02', b'\x03'), (b'\x01\x02', b'\x03'), (b'\x01\x02', b'\x03'))
如果您想取消嵌套此结果,可以使用 itertools.chain.from_iterable 进行。
>>> from itertools import chain
>>> tuple(chain.from_iterable(struct.iter_unpack(fmt, some_bytes)))
(b'\x01\x02', b'\x03', b'\x01\x02', b'\x03', b'\x01\x02', b'\x03')
当然,您可以使用嵌套推导来做同样的事情。
>>> tuple(x for subtuple in struct.iter_unpack(fmt, some_bytes) for x in subtuple)
(b'\x01\x02', b'\x03', b'\x01\x02', b'\x03', b'\x01\x02', b'\x03')