You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中高效操作二进制文件内存储的各类对象

推荐方案1:使用Python标准库struct模块实现结构化解析

struct是Python内置的二进制数据处理模块,可直接实现字节序列和Python基础类型的双向映射,无需手动计算切片偏移、处理类型转换,完全匹配你的使用场景。
你可以为每个自定义类预定义对应的字节格式串,将解析逻辑内聚到类内部,示例实现如下:

import struct

# 统一声明字节序为小端,和你当前读取逻辑保持一致
ENDIAN = '<'

class Rectangle:
    # 格式串说明:d对应8字节双精度浮点数,3个d对应三个字段
    _struct_fmt = ENDIAN + 'ddd'
    # 自动计算当前类占用的总字节数,无需手动统计
    byte_size = struct.calcsize(_struct_fmt)

    def __init__(self, width, height, angle):
        self.width = width
        self.height = height
        self.angle = angle
    
    @classmethod
    def from_bytes(cls, buffer, offset=0):
        # 直接从指定偏移位置解析数据,无需手动切片
        unpacked_data = struct.unpack_from(cls._struct_fmt, buffer, offset)
        return cls(*unpacked_data)

class Square:
    # 格式串说明:d对应8字节浮点数,?对应1字节bool值
    _struct_fmt = ENDIAN + 'd?'
    byte_size = struct.calcsize(_struct_fmt)

    def __init__(self, side_length, is_red):
        self.side_length = side_length
        self.is_red = is_red
    
    @classmethod
    def from_bytes(cls, buffer, offset=0):
        unpacked_data = struct.unpack_from(cls._struct_fmt, buffer, offset)
        return cls(*unpacked_data)

使用方式如下,可自动维护偏移量,适配循环、条件分支的解析逻辑:

with open('file.ext', 'rb') as f:
    file_buffer = f.read()

current_offset = 0
# 读取原示例中的4字节小端整数buffer_size
buffer_size = struct.unpack_from(f'{ENDIAN}I', file_buffer, offset=81)[0]
current_offset += 4

# 批量解析示例:假设已知接下来10个对象依次是矩形、正方形交替
result_objs = []
for i in range(10):
    if i % 2 == 0:
        obj = Rectangle.from_bytes(file_buffer, current_offset)
        current_offset += Rectangle.byte_size
    else:
        obj = Square.from_bytes(file_buffer, current_offset)
        current_offset += Square.byte_size
    result_objs.append(obj)

该方案不需要安装任何第三方依赖,结构修改时仅需要调整对应类的_struct_fmt即可,维护成本极低。

推荐方案2:使用声明式解析库construct处理复杂结构

如果你的二进制文件结构非常复杂,包含大量嵌套、条件分支、动态长度的对象,可以使用第三方库construct,它支持直接声明结构规则,自动处理偏移、条件判断,无需手动写解析逻辑:

from construct import Struct, Double, Byte, If, this, Array

# 直接声明结构规则
Rectangle = Struct(
    "width" / Double,
    "height" / Double,
    "angle" / Double
)
Square = Struct(
    "side_length" / Double,
    "is_red" / Byte
)

# 示例:条件解析,根据前一个字段的类型自动选择解析逻辑
Object = Struct(
    "type" / Byte,
    "data" / If(this.type == 0, Rectangle, Square)
)

# 直接从偏移位置解析,无需手动维护偏移
rect_obj = Rectangle.parse(file_buffer, offset=85)
# 批量解析10个对象
obj_list = Array(10, Object).parse(file_buffer, offset=current_offset)

内容的提问来源于stack exchange,提问作者user2962768

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:36:03