Python - эффективное объединение сжатых файлов

У меня есть куча сжатых файлов (.gz), и я хочу объединить их в один.

Я знаю инструмент CL:

cat file1.gz file2.gz > file.gz

а также я нашел это решение в stackoverflow:

with open(..., 'wb') as wfp:
  for fn in filenames:
    with open(fn, 'rb') as rfp:
      shutil.copyfileobj(rfp, wfp)

Однако есть ли другой способ сделать это с помощью Python, столь же эффективный, как cat?


person andrea_grioni    schedule 31.10.2019    source источник
comment
Гм, ваша zcat команда создает единственный распакованный файл в качестве вывода.   -  person Charles Duffy    schedule 31.10.2019
comment
Неужели любого из трех других ответов на этот связанный вопрос недостаточно?   -  person Sayse    schedule 31.10.2019
comment
Если вы хотите, чтобы на выходе был один сжатый файл, просто cat их без декомпрессии или повторного сжатия; совместимый декодер gzip обрабатывает несколько объединенных сжатых потоков так же, как и один поток (так работает rsyncable gzip, сбрасывая таблицу сжатия, чтобы блоки не зависели от содержимого блоков ранее).   -  person Charles Duffy    schedule 31.10.2019
comment
(ваше решение на собственном Python, указанное в вопросе, уже делает именно это, объединяя три сжатых потока в один сжатый поток без декомпрессии или повторного сжатия где-либо, что делает его очень непохожим на zcat, предложенный выше ).   -  person Charles Duffy    schedule 31.10.2019
comment
... так что мне кажется, что ваш настоящий вопрос заключается в том, как получить более эффективную конкатенацию файлов в Python, при этом сжатие просто сбивает с толку / сбивает с толку.   -  person Charles Duffy    schedule 31.10.2019
comment
да, я хотел бы знать, есть ли более эффективный способ объединить эти файлы с помощью Python, а не открывать и перебирать их. Если нет, я буду использовать cat.   -  person andrea_grioni    schedule 31.10.2019
comment
Вообще говоря, Python - неподходящий инструмент для работы, когда требуется быстрее, чем C. Особенно, когда это сильно оптимизированный C, такой как стандартная библиотека GNU и coreutils. Если вы видите, что cat работает намного быстрее, чем вы ожидаете, возможно, будет весело / интересно прочитать исходный текст.   -  person Charles Duffy    schedule 31.10.2019
comment
... есть несколько интересных приемов, которые можно использовать с современными ядрами Linux, говоря ядру, чтобы оно выполняло всю работу по копированию между файловыми дескрипторами, вообще не вовлекая пользователя. Не могу сказать, использует ли GNU cat их, не глядя, но это правдоподобно. А если это так, то вы можете начать с изучения того, написал ли кто-нибудь код Python для доступа к тем же возможностям.   -  person Charles Duffy    schedule 31.10.2019
comment
(Существуют и другие трюки, которые также зависят от выбора файловой системы и выравнивания; если вы используете btrfs с правильными необязательными флагами, можно указать файловой системе ссылаться на одни и те же блоки из разных позиций в двух разных файлах. , что означает, что на самом деле нет необходимости создавать дополнительную копию тех же данных на диске вообще, чтобы создать второй файл, который, по-видимому, содержит их).   -  person Charles Duffy    schedule 31.10.2019
comment
ну ... Я не хочу вдаваться в подробности сейчас, но я очень признателен за ваши объяснения. Ваши ответы открыли много интересных тем, которые я рассмотрю для новых проектов [например, выберите другой язык программирования, если скорость имеет значение].   -  person andrea_grioni    schedule 31.10.2019