我目前正在尝试创建一个模块,该模块最多可以写入* .gz文件。我想将其用于自定义日志处理程序,以指定压缩日志文件的最大大小。我已经通过gzip documentation和zlib documentation了。
我可以立即使用zlib并测量压缩字节数组的长度,但是随后我必须自己创建和编写gzip文件头。 zlib文档本身说:For reading and writing .gz files see the gzip module.
。
但是我看不到gzip模块中获取压缩文件大小的任何选项。
通过logfile
打开的logfile = gzip.open("test.gz", "ab", compresslevel=6)
确实有一个.size
参数,但这是原始文件的大小,而不是压缩文件的大小。
在关闭os.path.getsize("test.gz")
并将其实际写入磁盘之前,logfile
也为零。
您知道如何在压缩文件达到一定大小后使用内置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}")
答案 0 :(得分:0)
gzip直到关闭后才真正压缩文件,因此事先要求知道压缩文件的大小并没有任何意义。您可以做的一件事是查看从用例中的真实数据获得的压缩文件的大小,并进行线性回归以得到某种近似的压缩率。