Я сейчас пытаюсь создать модуль, который записывает файл * .gz до определенного c размера. Я хочу использовать его для пользовательского обработчика журналов, чтобы указать максимальный размер заархивированного файла журнала. Я уже прошел через документацию gzip , а также документацию zlib .
Я мог бы сразу использовать 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}")