如何在Python中提取zip文件中tar.gz文件的成员

如何在Python中提取zip文件中tar.gz文件的成员,python,zipfile,tarfile,Python,Zipfile,Tarfile,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文件包含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)
您可以使用该模块,与使用zipfile模块的方式非常相似。 要完成代码并获取tar.gz文件中的文件名,请执行以下操作:

def扫描压缩文件(zfile):
l_文件=[]
zipfile.zipfile(zfile,'r')作为zf:
对于zf.namelist()中的zname:
如果zname.endswith('.zip'):
zipfile.zipfile(io.BytesIO(zf.read(zname)))作为zf2:
l_files.extend(zf2.namelist())
elif zname.endswith('.tar.gz'):
将tarfile.open(fileobj=io.BytesIO(zf.read(zname))作为tf:
l_files.extend(tf.getnames())
其他:
l_files.append(zname)

tarfile.open的
fileobj
参数告诉它使用io.BytesIO返回的“类似文件的对象”。

你发布的代码有什么问题?它的输出与您期望的有什么不同?是否也要从tar.gz检索成员。。。不仅ziptarfile.open(io.BytesIO(zf.read(zname)))给出了异常:“应为str、bytes或os.PathLike对象,而不是_io.BytesIO”@f选项您忘记了fileobj参数编辑了答案以添加有关fileobj的信息