Размер файлов, сжатых модулем Python GZIP, не уменьшается - PullRequest
0 голосов
/ 22 мая 2018

Я сделал простой тестовый код, который генерирует много целых чисел и записывает их в сжатый файл с помощью модуля gzip .

import gzip
for idx in range(100000):
    with gzip.open('output.gz', 'ab') as f:
        line = (str(idx) + '\n').encode()
        f.write(line)

Сжатый файл создается, но когда яраспакуйте его, необработанные данные на самом деле намного меньше:

$ ls -l
  588890 output
 3288710 output.gz

Не могли бы вы объяснить, что я здесь не так делаю?

1 Ответ

0 голосов
/ 22 мая 2018

Предположение о том, что режим добавления будет добавляться к существующему потоку, неверно.Вместо этого он объединяет новый поток в существующий файл gzip.При распаковке они прозрачно объединяются, как если бы вы сжимали один файл.Но каждый поток содержит свой собственный верхний и нижний колонтитулы , и они складываются.Проверка вашего файла показывает

 % hexdump -C output.gz|head -n5
00000000  1f 8b 08 08 2e e7 03 5b  02 ff 6f 75 74 70 75 74  |.......[..output|
00000010  00 33 e0 02 00 12 cd 4a  7e 02 00 00 00 1f 8b 08  |.3.....J~.......|
00000020  08 2e e7 03 5b 02 ff 6f  75 74 70 75 74 00 33 e4  |....[..output.3.|
00000030  02 00 53 fc 51 67 02 00  00 00 1f 8b 08 08 2e e7  |..S.Qg..........|
00000040  03 5b 02 ff 6f 75 74 70  75 74 00 33 e2 02 00 90  |.[..output.3....|

Обратите внимание на повторение магического числа 1f 8b, отмечающего начало нового потока.

В общем случае, повторять открытиефайл в режиме добавления в цикле.Вместо этого откройте файл один раз для записи и запишите содержимое в цикле:

with gzip.open('output.gz', 'wb') as f:
    for idx in range(100000):
        line = (str(idx) + '\n').encode()
        f.write(line)

Полученный файл имеет размер около 200 КБ по сравнению с исходными 3 МБ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...