【问题标题】:get size of compressed file while compressing压缩时获取压缩文件的大小
【发布时间】:2020-07-09 08:41:46
【问题描述】:

我目前尝试创建一个将 *.gz 文件写入特定大小的模块。我想将它用于自定义日志处理程序以指定压缩日志文件的最大大小。我已经通过gzip documentationzlib documentation

我可以立即使用 zlib 并测量我的压缩字节数组的长度,但是我必须自己创建和编写 gzip 文件头。 zlib-documentaion 本身说:For reading and writing .gz files see the gzip module..
但我没有看到任何用于在 gzip 模块中获取压缩文件大小的选项。

通过logfile = gzip.open("test.gz", "ab", compresslevel=6) 打开的logfile 确实有一个.size 参数,但这是原始文件的大小,而不是压缩文件的大小。

logfile 关闭并实际写入磁盘之前,os.path.getsize("test.gz") 也为零。

您知道如何使用内置的 gzip 模块在压缩文件达到一定大小后关闭它吗?无需一直关闭并重新打开?

或者这甚至可能吗? 感谢您对此的任何帮助!

更新: 在文件关闭之前没有数据写入磁盘是不正确的,在文件大小更改之前收集一些千字节只是需要一些时间。这对我和我的用例来说很好,所以解决了。感谢您的任何意见!

我的测试代码:

import os
import gzip
import time

data = 'Hello world'
limit = 10000
i = 0

logfile = gzip.open("test.gz", "wb", compresslevel=6)
while i < limit:
    msg = f"{data} {str(i)} \n"
    logfile.write(msg.encode("utf-8"))
    print(os.path.getsize("test.gz"))
    print(logfile.size)
    if i > 1000:
        logfile.flush()
        break
    #time.sleep(0.03)
    i += 1
logfile.close()
print(f"final size of *.gz file: {os.path.getsize('test.gz')}")
print(f"final size of logfile object file: {logfile.size}")

【问题讨论】:

    标签: python gzip zlib


    【解决方案1】:

    gzip 直到你关闭它之后才真正压缩文件,所以事先询问压缩文件的大小是没有意义的。您可以做的一件事是查看从用例中获得的真实数据压缩文件的大小,并进行线性回归以获得某种压缩比的近似值。

    【讨论】:

    • 感谢您的想法。我刚刚更新了开始帖子,gzip确实在关闭文件之前将数据写入磁盘,但它需要足够的数据。但是您可以通过os.path.getsize() 简单地观看文件,或者如果您将gzip 与文件对象一起使用,您可以观看文件对象.tell() 函数