Python Gzip - 实时向文件追加内容

20

使用Python是否有可能在运行时向已压缩的文本文件追加内容?

基本上我正在做以下操作:-

import gzip
content = "Lots of content here"
f = gzip.open('file.txt.gz', 'a', 9)
f.write(content)
f.close()

每隔大约6秒钟会向文件中添加一行(注意“添加”),但生成的文件大小与标准未压缩文件相同(完成时约为1MB)。

明确指定压缩级别似乎也没有任何区别。

如果我事后gzip一个已有的未压缩文件,它的大小会降至约80kb左右。

我猜这不可能在流式处理中对gzip文件进行“追加”,并对其进行压缩?

这是否需要先将内容写入String.IO缓冲区,然后在完成时刷新到gzip文件中?


5
为了让gzip算法高效工作,它必须获得要压缩的整个内容。否则,你只是追加一些毫不相关的已经被gzip压缩过的内容块。 - Nadh
@Nadh 所以我猜我的最后一行是正确的吧?把数据写入String.IO并刷新到gzip? - general exception
1
是的,那应该可以。你只需要确保所有内容在任何时刻都被一起压缩。 - Nadh
3
问题在于一次仅附加一行数据。为了使gzip有效地工作,它需要一次性至少一些数据---不一定是整个文件,但肯定比一行更多。如果一次发送整个文件太多了,你也可以将它分成16KB等大小的块进行发送。 - Armin Rigo
假设这是数据预处理,您能在处理数据之前追加该行吗?也就是说,不要打开gzip ->写入->关闭->打开gzip ->处理,而是打开gzip ->读取->添加一行->处理。 - Patrick the Cat
显示剩余2条评论
1个回答

19

这种方法可以创建和维护有效的gzip文件,因为gzip格式允许串联gzip流。

然而,从压缩效果来看,它并不太好,因为每个gzip压缩实例所处理的数据非常少。压缩依赖于利用先前数据的历史记录,但在这里,gzip实际上没有得到任何记录。

您可以使用以下两种方法:a) 累积至少几千字节的数据或多行文本,然后再调用gzip将其添加到文件中的另一个gzip流,或者b) 进行更加复杂的操作,将其追加到单个gzip流中,在每次操作后留下一个有效的gzip流,并允许高效压缩数据。

您可以在C语言中找到b)的示例,位于gzlog.hgzlog.c。我认为Python没有实现直接在Python中实现gzlog所需的所有zlib接口,但是您可以从Python与C代码交互。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接