Python Gzip - добавление к файлу на лету

Можно ли добавить в текстовый файл gzipped на лету с помощью Python?

В основном я делаю это: -

import gzip
content = "Lots of content here"
f = gzip.open('file.txt.gz', 'a', 9)
f.write(content)
f.close()

В файл добавляется строка (примечание "добавлено" ) каждые 6 секунд или около того, но полученный файл имеет такой же размер, как стандартный несжатый файл (примерно 1 МБ, когда это делается).

Явное указание уровня сжатия, похоже, не имеет значения.

Если после этого gzip существующий несжатый файл, размер будет примерно до 80 килобайт.

Я предполагаю, что его невозможно "добавить" в gzip файл "на лету" и сжать его?

Является ли это случаем записи в буфер String.IO, а затем, когда это делается, сбрасывается в файл gzip?

Ответ 1

Это работает в смысле создания и поддержки действительного файла gzip, поскольку формат gzip позволяет объединить потоки gzip.

Однако это не работает в том смысле, что вы получаете паршивое сжатие, поскольку вы даете каждому экземпляру сжатия gzip так мало данных для работы. Сжатие зависит от использования предыстории предыдущих данных, но здесь gzip практически отсутствует.

Вы можете либо a) накапливать по меньшей мере несколько K данных, многие из ваших строк, перед вызовом gzip для добавления в файл другого потока gzip или b) сделать что-то гораздо более сложное, которое добавляется к одному потоку gzip, оставляя действительный поток gzip каждый раз и разрешая эффективное сжатие данных.

Вы найдете пример b) в C, в gzlog.h и gzlog.c. Я не считаю, что Python имеет все интерфейсы для zlib, необходимые для реализации gzlog непосредственно в Python, но вы можете подключиться к C-коду из Python.