我们说我有一个产生文本的流(生成器)。它们通常是JSON字符串,但可以是任何字符串。我无法将其实例化为列表。太大了。
我想获取此流并生成另一个流,该流由压缩后加密组成。有什么好办法呢?
加密部分并不那么难,但压缩通常需要一批数据。是否有纯粹的流媒体方式来做到这一点?如果没有,那么什么是足够好的选择?
我也不想创建任何文件。
答案 0 :(得分:2)
stdlib zlib
支持通过一次输入数据块来压缩数据流。请参阅compressobj
和Compress
类型。
请注意,您可以根据需要输入尽可能多的字节数;压缩器对象执行自己的缓冲以保持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)
...
请注意,它永远不会创建包含所有数据的列表!