在Python中读取结构二进制数据?
有没有类似于Ruby的BinData的好用的Python解决方案,可以用来读取用户自定义的二进制文件或流格式?如果没有,那在Python中除了使用struct模块,还有什么更好的方法呢?
我有一个二进制文件,里面存储了“事件记录”。这些记录的大小是动态的,所以我必须先读取每条记录的前几个字节,以确定记录的长度和类型。不同类型的记录会有不同的字节布局。例如,类型为“警告”的记录可能包含三个4字节的整数,后面跟着一个128字节的值,而类型为“信息”的记录可能只有五个4字节的整数。
如果能以某种方式定义不同的记录类型及其结构,这样我只需把一个二进制数据块传给某个东西,它就能处理剩下的事情(比如生成对象等),那就太好了。简单来说,就是你在定义如何解释这些二进制数据的模板或映射。
4 个回答
2
你可以试试使用结构体模块,它应该能满足你的需求。不过,你也可以使用谷歌的协议缓冲区的Python接口。
3
Python的struct模块是这样工作的:
record_header = struct.Struct("<cb")
warning = struct.Struct("<iii128")
info = struct.Struct("<iiiii")
while True:
header_text = input.read(record_header.size)
# file is empty
if not header_text:
break
packet_type, extra_data = record_header.unpack(header_text)
if packet_type == 'w':
warning_data = warning.unpack( input.read(warning.size) )
elif packet_type == 'i':
info_data = info.unpack( input.read(info.size) )
想了解更多细节,可以查看文档: http://docs.python.org/library/struct.html
4
也许你在寻找一个叫做 Construct 的东西,它是一个用纯Python写的二进制解析库,支持Python 2和3。