如何在Python中压缩一个相当长的二进制字符串,以便以后能够访问它



我有一个很长的项目数组(4700(,与另一个列表中的设置相比,这些项目最终将为1或0。我希望能够构造一个单一的整数/字符串项,我可以将其存储在一些元数据中,以便以后可以访问它,以便唯一地识别进入其中的项的组合。

我正在用Python写这一切。我正在考虑做一些类似zlib压缩加十六进制转换的事情,但我对如何进行逆变换感到困惑。因此,假设bin_string是1和0的字符串数组,它应该看起来像这个

import zlib
#example bin_string, real one is much longer
bin_string="1001010010100101010010100101010010101010000010100101010" 
compressed = zlib.compress(bin_string.encode())
this_hex = compressed.hex()

然后我可以将this_hex保存到元数据中。问题是,如何从十六进制值中获取原始bin_string?我在数值方法等方面有很多Python经验,但在压缩方面很少,所以任何基本的见解都非常有价值。

只需对每个操作执行相反的操作。此:

zlib.decompress(bytearray.fromhex(this_hex)).decode()

将返回您的原始字符串。

简单地将您的比特编码为字节字符串中的比特,再加上终止的一个比特后跟零来填充最后一个字节,这将更快,甚至可能导致更好的压缩。这将是7个字节,而不是从zlib.compress()得到的22个字节。只有当0或1有很强的偏差,和/或0和1中有重复的模式时,zlib才会做得更好。

至于元数据的编码,Base64将比十六进制更紧凑。你的例子是lKVKVKoKVQ==

您应该尝试使用numpy 的.savez_compressed((方法

将你的简单数组转换为numpy数组,然后使用这个-

numpy.savez_compressed("filename.npz")

使用

numpy.load()

加载.npz文件

相关内容

  • 没有找到相关文章

最新更新