как извлечь элементы файла tar.gz в zip-файл в Python - PullRequest
0 голосов
/ 02 августа 2020

zip-файл содержит файл tar.gz. Как получить элементы файла tar.gz без предварительного извлечения на диск?

abc.zip
  |- def.txt
  |- ghi.zip 
  |- jkl.tar.gz


def scan_zip_file(zfile):
    l_files = []
    with zipfile.ZipFile(zfile, 'r') as zf:
        for zname in zf.namelist(): 
            if zname.endswith('.zip'):
                with zipfile.ZipFile(io.BytesIO(zf.read(zname))) as zf2:
                   l_files.extend(zf2.namelist())
            elif zname.endswith('.tar.gz'):
                pass
            else:
                l_files.append(zname)

1 Ответ

1 голос
/ 02 августа 2020

Вы можете использовать модуль tarfile точно так же, как вы использовали модуль zipfile. Чтобы завершить ваш код и получить имена файлов в файле tar.gz:

def scan_zip_file(zfile):
    l_files = []
    with zipfile.ZipFile(zfile, 'r') as zf:
        for zname in zf.namelist(): 
            if zname.endswith('.zip'):
                with zipfile.ZipFile(io.BytesIO(zf.read(zname))) as zf2:
                   l_files.extend(zf2.namelist())
            elif zname.endswith('.tar.gz'):
                with tarfile.open(fileobj=io.BytesIO(zf.read(zname))) as tf:
                   l_files.extend(tf.getnames())
            else:
                l_files.append(zname)

Аргумент fileobj для tarfile.open указывает ему использовать 'File-like object', который io.BytesIO возвращается.

...