SunnyEdward 2022-03-11 11:07 采纳率: 75%
浏览 347
已结题

关于msgpack报错: ExtraData: unpack(b) received extra data.

问题遇到的现象和发生背景

我有多个msgpack文件,把他们组合在一起后,就打不开了。

组合多个msgpack
import msgpack
with open('/home/suned/data/giscup_2021_1/totalmsgpack/total.msgpack','wb') as f1:
    for i in range(1,32):
        file_name = f"202008{i:02}.msgpack"
        with open(f'/home/suned/data/giscup_2021_1/msgpack/{file_name}','rb') as f2:
            unpacked = msgpack.unpackb(f2.read())
            msgpack.dump(unpacked,f1)
想要反序列化组合后的文件(total.msgpack)
import msgpack
with open('/home/suned/data/giscup_2021_1/totalmsgpack/total.msgpack', 'rb') as f1:
    dct1 = msgpack.unpackb(f1.read())
    print(dct1)

报错

ExtraData                                 Traceback (most recent call last)
/tmp/ipykernel_85730/2692480189.py in <module>
      1 import msgpack
      2 with open('/home/suned/data/giscup_2021_1/totalmsgpack/total.msgpack', 'rb') as f1:
----> 3     dct1 = msgpack.unpackb(f1.read())
      4     print(dct1)

msgpack/_unpacker.pyx in msgpack._cmsgpack.unpackb()

ExtraData: unpack(b) received extra data.
但是组合前的单个msgpack是可以打开的,比如打开20200801.msgpack
with open('/home/suned/data/giscup_2021_1/msgpack/20200801.msgpack', 'rb') as f2:
    dct2 = msgpack.unpackb(f2.read())
    print(dct2)

img

我的想法

单个msgpack做unpackb后的结构是一个列表,列表里面包含多个字典结构,类似
[{'order_id': 5966280.0, 'eta': 531.0, 'dist': 2923.0, 'simple_eta': 495.0, 'driver_id': 75457.0, 'slice_id': 153.0},{'order_id': 6099942.0, 'eta': 590.0, 'dist': 3212.278, 'simple_eta': 559.0, 'driver_id': 19210.0, 'slice_id': 157.0}...]
是不是做了组合后,totalmsgpack里面包含了多个列表结构,所以出现了这个错误呢?(received extra data)
弄了一天了,没能解决呀,头疼。

  • 写回答

1条回答 默认 最新

  • 陈年椰子 2022-03-11 11:46
    关注

    估计就是你说的问题。 一个标准的 msgpack 文件是只有1个字典列表?
    就是这种形式

    [{},{},{}]
    

    你现在合并后,变成这种形式

    [{},{},{}]
    [{},{},{}]
    [{},{},{}]
    

    是这样吧?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月22日
  • 已采纳回答 3月14日
  • 修改了问题 3月11日
  • 创建了问题 3月11日

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容