Python Gzip - 即时附加到文件
Posted
技术标签:
【中文标题】Python Gzip - 即时附加到文件【英文标题】:Python Gzip - Appending to file on the fly 【发布时间】:2013-08-08 11:00:54 【问题描述】:是否可以使用 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 文件的情况吗?
【问题讨论】:
为了使 gzip 算法有效地工作,它必须掌握要压缩的整个内容。否则,您只是在附加大量彼此无关的 gzip 压缩内容。 @Nadh 所以我猜我的最后一行是正确的?写入 String.IO 并刷新到 gzip ? 是的,应该可以。您只需要确保所有内容在任何时候都被压缩在一起。 我依稀记得zlib可以用来进行流式压缩,即不用提前看到所有数据。 问题是一次只追加一行数据。要使 gzip 有效地工作,它至少需要一次 一些 数据量 --- 不一定是整个文件,但肯定不止一行。如果一次发送整个文件太多,您也可以发送 16KB 之类的。 【参考方案1】:这在创建和维护一个有效的 gzip 文件的意义上是有效的,因为 gzip 格式允许串联的 gzip 流。
但是,在您得到糟糕的压缩的意义上,它不起作用,因为您为每个 gzip 压缩实例提供了很少的数据可以使用。压缩依赖于利用以前数据的历史,但这里 gzip 基本上没有给出。
您可以 a) 在调用 gzip 以将另一个 gzip 流添加到文件之前,累积至少几 K 的数据,许多行,或者 b) 执行一些更复杂的操作,附加到单个 gzip 流,每次都留下一个有效的 gzip 流,并允许有效压缩数据。
您可以在 C、gzlog.h 和 gzlog.c 中找到 b) 的示例。我不相信 Python 具有直接在 Python 中实现 gzlog 所需的所有 zlib 接口,但您可以从 Python 与 C 代码进行接口。
【讨论】:
以上是关于Python Gzip - 即时附加到文件的主要内容,如果未能解决你的问题,请参考以下文章