У меня следующая проблема: я пишу функцию, которая ищет кучу файлов .gz
, распаковывает их и сохраняет отдельные несжатые файлы в большем архиве .tar.gz
. До сих пор мне удалось реализовать его с помощью следующего кода, но вычисление размера несжатого файла вручную и установка размера TarInfo
кажутся довольно хакерскими, и я хотел бы знать, есть ли более идиоматическое решение для моя проблема:
import gzip
import os
import pathlib
import tarfile
def gather_compressed_files(input_dir: pathlib.Path, output_file: str):
with tarfile.open(output_file, 'w:gz') as tar:
for input_file in input_dir.glob('*.gz'):
with gzip.open(input_file) as fd:
tar_info = tarfile.TarInfo(input_file.stem)
tar_info.size = fd.seek(0, os.SEEK_END)
fd.seek(0, os.SEEK_SET)
tar.addfile(tar_info, fd)
Я попытался создать объект TarInfo
следующим образом, вместо того, чтобы создавать его вручную:
tar_info = tar.gettarinfo(arcname=input_file.stem, fileobj=fd)
Однако эта функция извлекает путь к исходному файлу .gz
, который мы открыли как fd
, чтобы вычислить его размер, и, таким образом, предоставляет только параметр tar_info.size
, соответствующий сжатым данным .gz
, а не несжатому данные, которые не то, что я хочу. Не установка параметра tar_fino.size
вообще не работает, потому что addfile
использует указанный размер при передаче дескриптора файла.
Есть ли лучший идиоматичный способ добиться этого или я застрял в своем текущем решении?