我有一个包含二进制数据条目的列表,每个条目都有一个任意长度。我想将这一切存储在一个大的二进制字符串中。考虑到这些数据可能包含任何字符序列,我可能会选择将列表中的每个条目分开,如何将此列表打包成仍包含不同条目的字符串?
答案 0 :(得分:3)
pickle
协议应该这样做。 dump
写入文件,dumps
写入字符串。
mylist = [list of large integers]
pickle.dump(mylist, open('somefile', 'wb'), protocol=2)
答案 1 :(得分:2)
出于您所说的原因,您不能使用单个字符来分隔它们。您可以指定一个特殊的分隔符,因此0x0
。然后,您还需要一种方法来转义数据中出现的任何0x0
。但是,您还需要在显示的任何位置转义转义字符。
答案 2 :(得分:2)
与使用分隔符相比,您可能最好为要遵循的对象长度写入字节数。
如果纯粹的空间效率并不重要,那么另一种可行的方法就是使用pickle
代替。还有一个选项是对字节进行base64编码,然后在base64字符集之外使用分隔符。
答案 3 :(得分:0)
不确定为什么需要输出为二进制,所以这可能不适合你。但是,您可以使用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']