在Python中读取结构二进制数据?

4 投票
4 回答
2960 浏览
提问于 2025-04-16 18:21

有没有类似于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。

撰写回答