1

我有以下功能:

def save(msg):
    with gzip.open("ircbot.log.gz", "ab") as f:
        f.write(msg+'\n')
        f.close()
        return "Succesfully logged: "+msg

我想将每个味精添加到 .log 文件中,但它不起作用,只保存第一个味精。

例如在调用这些函数之后:

save('first')
save('second')
save('third')

.log 文件仅包含“第一个”。

对于简单的 .txt 文件,它工作正常。Gzip 不支持附加到文件?

4

3 回答 3

3

正如您所发现的,连接 gzip 流以生成可提取的 gzip 文件(即f.close()在每条消息之后)确实有效。这是因为 gzip 标准要求兼容的解压缩器在解码当前的 gzip 流后查找另一个 gzip 流。但是,假设您的消息相对较短,例如一两行,那么生成的 gzip 文件将更大,而不是比包含消息的简单文本文件小。每条消息将至少具有 18 个字节的 gzip 标头和尾部的开销,并且数据可能会扩展 5 个字节,每条消息增加 23 个字节。

在每条消息之后不使用的替代方案f.close()将导致数据的真正压缩,方法是编写单个 gzip 流,其中后期消息的压缩可以利用早期消息的冗余。但是,这样做的缺点是在您最终调用f.close(). 此外,消息根本不会被写入(如果它们很短,则再次写入),直到积累了足够的数据来压缩一个块。然后会一串串的写入,文件会再次等待更多的积累。

有一个解决方案,但我认为 python 没有足够完整的 zlib 接口来允许它。您可以查看 C 语言中的示例gzlog.hgzlog.c,它们立即将日志条目写入 gzip 文件,并始终使日志文件处于完整且正确的状态。

于 2012-12-22T16:54:39.987 回答
0

对我有用,没有额外的f.close(),Linux,python-2.7,都有由这个脚本创建的 gzip 文件和由常规 gzip 命令创建的 gzip 文件。

于 2012-12-22T13:53:36.773 回答
0

好的,我想通了。

我使用 Altap Salmander 提取 .gz 并查看日志文件(F3 功能)。

当我用 7zip 在经典资源管理器中提取 gz 文件时,所有的味精都在那里。

于 2012-12-22T13:35:10.683 回答