У меня есть список, содержащий записи двоичных данных, каждая запись произвольной длины. Я хотел бы сохранить все это в одной большой двоичной строке. Учитывая, что эти данные могут содержать любую последовательность символов, которую я мог бы выбрать для разделения каждой записи в моем списке, как я могу упаковать этот список в строку, в которой все еще есть отдельные записи?

trevorKirkby

Ответов: 4

Ответы (4)

Не уверен, зачем вам нужен двоичный вывод, так что это может не сработать для вас. Однако вы можете записать свои данные в одну строку, используя zlib:

>>> import zlib
>>> l=[bin(i) for i in range(10)]
>>> zlib.compress(str(l))
'x\x9c\x8bV7H2P\xd7Q\x00R\x86P\n\xc6\x85\xf3a\x02\x060\x11\x84\x12\x84\x1a\xb8"\xa0\xaaX\x00\xe9\x95\x11\x14'

Тогда можно легко распаковать:

>>> zlib.decompress(zlib.compress(str(l)))
"['0b0', '0b1', '0b10', '0b11', '0b100', '0b101', '0b110', '0b111', '0b1000', '0b1001']"

Чтобы превратить его обратно в список оттуда, вы можете использовать eval:

>>> new_l=eval(zlib.decompress(zlib.compress(str(l))))
>>> new_l
['0b0', '0b1', '0b10', '0b11', '0b100', '0b101', '0b110', '0b111', '0b1000', '0b1001']

Протокол pickle должен это делать.дамп записывает в файл и дамп записывает в строку.

mylist = [list of large integers]
pickle.dump(mylist, open('somefile', 'wb'), protocol=2)

Вы не можете использовать один символ для разделения их по той причине, которую вы говорите. Вы можете назначить специальный символ-разделитель, например 0x0. Тогда вам также понадобится способ избежать любых 0x0s, которые появляются в данных. Однако вам также нужно будет экранировать escape-символ везде, где он появляется.

Вам, вероятно, лучше записать количество байтов для длины следующих объектов, чем использовать разделитель.

Если чистая экономия пространства не критична, другой способ, который может сработать, - использовать вместо него pickle. Еще один вариант - кодировать байты base64, а затем использовать разделитель вне набора символов base64.

2022 WebDevInsider