Добавить новые данные msgpack в конец файла

Допустимо ли добавлять объекты в данные msgpack без предварительного декодирования?

Т.е. что-то подобное:

  • кодировать данные1
  • пакет данных1
  • записать упакованные данные1 в файл

Затем,

  • пакет данных2
  • добавить упакованные данные2 в конец файла

или это должно быть:

  • читать файл
  • Файл msgunpack -> data1
  • создать данные1_2 (включая данные1, данные2)
  • пакет данных1_2
  • записать упакованные данные1_2 в файл

2 ответа

Решение

Вы можете просто добавить в файл. Посмотрите, как распаковать файл msgpack? для моего примера кода для чтения записи вы увидите, что я тоже добавляю, и это работает.

Расширяя ответ Алекса, поскольку спецификация до сих пор не разъясняет этого, и я не был уверен, как перевести эту парадигму в другие библиотеки. Я не уверен, что это часть официальной спецификации, но это наименее удивительный способ реализации, и он имеет интуитивный смысл. Это чрезвычайно полезно, если вам нужен формат данных только для добавления.

Вы должны иметь возможность просто объединять любые упакованные объекты msgpack. В вашей библиотеке должна быть какая-то Unpackerclass, который принимает поток байтов, содержащий один или несколько объединенных объектов 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 вполне распаковщикчитабелен .

Другие вопросы по тегам