【发布时间】:2020-07-09 08:41:46
【问题描述】:
我目前尝试创建一个将 *.gz 文件写入特定大小的模块。我想将它用于自定义日志处理程序以指定压缩日志文件的最大大小。我已经通过gzip documentation 和zlib 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}")
【问题讨论】: