python - 如何从一个文件块中解压缩多个 msgpack 数据
问题描述
我想知道是否可以从一个文件块中解压缩多个 msgpack 对象?
在下面的示例代码中,我将 2 个 msgpack 对象写入文件,当我回读时,如果我指定了正确的大小,我可以毫无问题地解压它们。如果我完全阅读了文件,有没有办法将整个内容解压缩到反序列化对象列表中?
Python 3.6.5 |Anaconda, Inc.| (default, Apr 26 2018, 08:42:37)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>
>>> import msgpack
>>> d1 = {'a': 1, 'b': 2}
>>> a1 = [1,2,3,4,5]
>>> pack1 = msgpack.packb(d1, use_bin_type=True)
>>> pack2 = msgpack.packb(a1, use_bin_type=True)
>>> size1 = len(pack1)
>>> size2 = len(pack2)
>>> size1
7
>>> size2
6
>>> with open('test.dat', 'wb') as fh:
... fh.write(pack1)
... fh.write(pack2)
...
7
6
>>> fh = open('test.dat', 'rb')
>>> p1 = fh.read(7)
>>> msgpack.unpackb(p1, raw=False)
{'a': 1, 'b': 2}
>>> fh.seek(7)
7
>>> p2 = fh.read(6)
>>> msgpack.unpackb(p2, raw=False, use_list=True)
[1, 2, 3, 4, 5]
>>> fh.seek(0)
0
>>> p = fh.read()
>>> p
b'\x82\xa1a\x01\xa1b\x02\x95\x01\x02\x03\x04\x05'
>>> msgpack.unpackb(p)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "msgpack/_unpacker.pyx", line 208, in msgpack._unpacker.unpackb
msgpack.exceptions.ExtraData: unpack(b) received extra data.
>>> for unp in msgpack.unpackb(p):
... print(unp)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "msgpack/_unpacker.pyx", line 208, in msgpack._unpacker.unpackb
msgpack.exceptions.ExtraData: unpack(b) received extra data.
感谢您的时间。
解决方案
感谢@hmm 的评论,下面的代码将起作用:
>>> fh.seek(0)
0
>>> unp = msgpack.Unpacker(fh, raw=False)
>>> for unpacker in unp:
... print(unpacker)
...
{'a': 1, 'b': 2}
[1, 2, 3, 4, 5]
推荐阅读
- javascript - 如何修复错误:尝试导入错误:“Navlink”未从“react-router-dom”导出
- r - Costum 动态 pandoc(或 Latex)命令设置文本颜色
- javascript - TypeError:无法将属性值解构为“null”或“undefined”
- mongodb - MongoDB 排序:等价聚合查询
- swiftui - SwiftUI 弹出框大小未扩展以适应内容
- python - 如何使用文本输入中的变量作为标签的文本(kivy)
- pywinauto - pywinauto | 从 child_window() 获取图块
- python - 无论如何使用TensorFlow分别加载数据和标签
- pandas - 根据满足条件的另一个列表的值过滤列表
- git - 在 Git 中,我怎样才能 rebase + squash 一个在其历史中具有多个合并提交的分支,而无需挑选到一个全新的分支