Добавить новые данные msgpack в конец файла
Допустимо ли добавлять объекты в данные msgpack без предварительного декодирования?
Т.е. что-то подобное:
- кодировать данные1
- пакет данных1
- записать упакованные данные1 в файл
Затем,
- пакет данных2
- добавить упакованные данные2 в конец файла
или это должно быть:
- читать файл
- Файл msgunpack -> data1
- создать данные1_2 (включая данные1, данные2)
- пакет данных1_2
- записать упакованные данные1_2 в файл
2 ответа
Вы можете просто добавить в файл. Посмотрите, как распаковать файл msgpack? для моего примера кода для чтения записи вы увидите, что я тоже добавляю, и это работает.
Расширяя ответ Алекса, поскольку спецификация до сих пор не разъясняет этого, и я не был уверен, как перевести эту парадигму в другие библиотеки. Я не уверен, что это часть официальной спецификации, но это наименее удивительный способ реализации, и он имеет интуитивный смысл. Это чрезвычайно полезно, если вам нужен формат данных только для добавления.
Вы должны иметь возможность просто объединять любые упакованные объекты msgpack. В вашей библиотеке должна быть какая-то
Unpacker
class, который принимает поток байтов, содержащий один или несколько объединенных объектов msgpack, и испускает поток распакованных структур. Если в вашей библиотеке нет этой функции, вам, вероятно, придется реализовать ее самостоятельно.
Вот как это выглядит в пакете python msgpack :
from io import BytesIO
import msgpack as mp
buf = BytesIO()
buf.write(packer.pack(1))
buf.write(packer.pack(2))
buf.write(packer.pack('foo'))
buf.write(packer.pack(True))
buf.write(packer.pack({"spam":"eggs"}))
print('file contents: {}'.format(buf.getvalue()))
buf.seek(0)
unpacker = mp.Unpacker(buf)
for i, obj in enumerate(unpacker):
print('{}: {} {}'.format(i, repr(obj), type(obj)))
Вне:
file contents: b'\x01\x02\xa3foo\xc3\x81\xa4spam\xa4eggs'
0: 1 <class 'int'>
1: 2 <class 'int'>
2: 'foo' <class 'str'>
3: True <class 'bool'>
4: {'spam': 'eggs'} <class 'dict'>
Если вы хотите реализовать свой собственный, резервный python вполне распаковщикчитабелен .