如何从单个文件块中解包多个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
相关产品推荐
相关产品推荐

