如何在Python中压缩和加密文本流

时间:2018-04-25 16:39:33

标签: python encryption compression

我们说我有一个产生文本的流(生成器)。它们通常是JSON字符串,但可以是任何字符串。我无法将其实例化为列表。太大了。

我想获取此流并生成另一个流,该流由压缩后加密组成。有什么好办法呢?

加密部分并不那么难,但压缩通常需要一批数据。是否有纯粹的流媒体方式来做到这一点?如果没有,那么什么是足够好的选择?

我也不想创建任何文件。

2 个答案:

答案 0 :(得分:2)

stdlib zlib支持通过一次输入数据块来压缩数据流。请参阅compressobjCompress类型。

请注意,您可以根据需要输入尽可能多的字节数;压缩器对象执行自己的缓冲以保持zlib的快乐。

构建了许多其他压缩库,以在某种程度上模仿zlib的接口。

而且,正如您所知,加密通常不是问题。

由于你是从文本而不是字节开始的,因此对你的问题也有一个很重要的部分:对文本进行编码。您可以将codecs模块用于流编码器,但由于听起来您一次只有一行生成器,(line.encode('utf-8') for line in lines)应该没问题。 (你可能已经知道了这一部分,这就是为什么你没有问 - 但是同样问题的未来搜索者可能不会。)

答案 1 :(得分:0)

您可以使用itertools recipe

中的石斑鱼对数据进行分组
from itertools import zip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

chunksize = 10
iterable = range(100)
for chunk in grouper(iterable, chunksize, fillvalue=''):
    print(chunk)

返回:

(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
(10, 11, 12, 13, 14, 15, 16, 17, 18, 19)
(20, 21, 22, 23, 24, 25, 26, 27, 28, 29)
...

请注意,它永远不会创建包含所有数据的列表!