【问题标题】:Python Gzip - Appending to file on the flyPython Gzip - 即时附加到文件
【发布时间】: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 之类的。

标签: python gzip raspberry-pi raspbian


【解决方案1】:

这在创建和维护一个有效的 gzip 文件的意义上是有效的,因为 gzip 格式允许串联的 gzip 流。

但是,在您得到糟糕的压缩的意义上,它不起作用,因为您为每个 gzip 压缩实例提供了很少的数据可以使用。压缩依赖于利用以前数据的历史,但这里 gzip 基本上没有给出。

您可以 a) 在调用 gzip 以将另一个 gzip 流添加到文件之前,累积至少几 K 的数据,许多行,或者 b) 执行一些更复杂的操作,附加到单个 gzip 流,每次都留下一个有效的 gzip 流,并允许有效压缩数据。

您可以在 C、gzlog.hgzlog.c 中找到 b) 的示例。我不相信 Python 具有直接在 Python 中实现 gzlog 所需的所有 zlib 接口,但您可以从 Python 与 C 代码进行接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多