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

如何从单个文件块中解包多个msgpack对象?

解包单个文件块中的多个msgpack对象

当然可以做到!你遇到的ExtraData错误,是因为msgpack.unpackb()只能处理单个msgpack序列化对象——当你传入包含多个对象的字节串时,它解析完第一个对象后发现还有剩余数据,就会抛出这个错误。

要一次性解包多个连续的msgpack对象,你需要使用msgpack.Unpacker这个流式解包器,它会自动处理字节流中的多个对象,逐个解析直到所有数据被处理完毕。

方法1:处理已读取的整个文件内容

如果你已经把整个文件的字节内容读进了内存(就像你示例里的p = fh.read()),可以用以下方式解包:

import msgpack

# 读取整个文件内容
with open('test.dat', 'rb') as fh:
    p = fh.read()

# 初始化Unpacker,传入你的配置参数(比如use_list=True、raw=False)
unpacker = msgpack.Unpacker(use_list=True, raw=False)
# 将字节内容喂给Unpacker
unpacker.feed(p)

# 遍历Unpacker即可得到所有反序列化后的对象
objects = list(unpacker)
print(objects)
# 输出结果: [{'a': 1, 'b': 2}, [1, 2, 3, 4, 5]]

方法2:直接从文件流读取(更高效)

如果文件很大,不需要把整个文件读进内存,可以直接把文件对象传给Unpacker,它会自动流式读取并解析:

import msgpack

objects = []
with open('test.dat', 'rb') as fh:
    # 直接将文件句柄传给Unpacker
    unpacker = msgpack.Unpacker(fh, use_list=True, raw=False)
    # 遍历解包每个对象
    for obj in unpacker:
        objects.append(obj)

print(objects)
# 同样输出: [{'a': 1, 'b': 2}, [1, 2, 3, 4, 5]]

为什么之前的方法失败?

  • msgpack.unpackb()是专门为单个msgpack对象设计的API,它会严格检查输入字节串是否刚好对应一个完整的对象,多余的字节会触发ExtraData异常。
  • Unpacker则是为流式场景设计的,它会持续解析输入的字节流,直到所有对象都被提取出来,完美适配你这种把多个msgpack对象连续写入文件的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:48:31