使用 Python 将 zip 文件和嵌套的 zip 文件提取到目标目录中

Posted

技术标签:

【中文标题】使用 Python 将 zip 文件和嵌套的 zip 文件提取到目标目录中【英文标题】:Extract zip file and nested zip files into target directory using Python 【发布时间】:2020-12-22 20:22:51 【问题描述】:

我有一个类似这样的文件结构:

/a.zip

    /not_a_zip/

        内容

    /b.zip

        内容

我想创建一个目录 a 并将 a.zip 提取到其中以及所有嵌套的压缩文件所在的位置,因此我得到如下内容:

/a/

    /not_a_zip/

        内容

    /b/

        内容

我尝试了this 解决方案,但我遇到了错误,因为在我的主目录中我有子目录以及 zip 文件。

我希望能够将主 zip 文件提取到同名目录中,然后能够提取其中的所有嵌套文件,无论它们嵌套多深。

编辑:我当前的代码是这样的

archive = zipfile.ZipFile(zipped, 'r')
for file in archive.namelist():
    archive.extract(file, resultDirectory)

for f in [filename for filename in archive.NameToInfo if filename.endswith(".zip")]:
    # get file name and path to extract
    fileToExtract = resultDirectory + '/' + f
    # get directory to extract new file to
    directoryToExtractTo = fileToExtract.rsplit('/', 1)
    directoryToExtractTo = directoryToExtractTo[0] + '/'
    # extract nested file
    nestedArchive = zipfile.ZipFile(fileToExtract, 'r')
    for file in nestedArchive.namelist():
        nestedArchive.extract(fileToExtract, directoryToExtractTo)

但我收到此错误:

KeyError: "There is no item named 'nestedFileToExtract.zip' in the archive"

即使它存在于文件系统中

【问题讨论】:

【参考方案1】:

基于此其他解决方案:this 和 this。

import os
import io
import sys
import zipfile


def extract_with_structure(input_file, output):
    with zipfile.ZipFile(input_file) as zip_file:
        print(f"namelist: zip_file.namelist()")
        for obj in zip_file.namelist():
            filename = os.path.basename(obj)

            if not filename:
                # Skip folders
                continue

            if 'zip' == filename.split('.')[-1]:
                # extract a zip
                content = io.BytesIO(zip_file.read(filename))
                f = zipfile.ZipFile(content)
                dirname = os.path.splitext(os.path.join(output, filename))[0]
                for i in f.namelist():
                    f.extract(i, dirname)
            else:
                # extract a file
                zip_file.extract(obj, os.path.join(output))


if __name__ == "__main__":
    if len(sys.argv) < 3:
        print("No zipfile specified or output folder.")
        exit(1)
    
    extract_with_structure(sys.argv[1], sys.argv[2])

【讨论】:

在使用您的代码块时,我仍然收到相同的 KeyError。似乎代码没有在文件结构中提取与根 zip 文件同名的目录,如下所示:/directory_to_extract.zip >/directory_to_extract/ 尝试运行脚本:python3 script.py file.zip output_folder

以上是关于使用 Python 将 zip 文件和嵌套的 zip 文件提取到目标目录中的主要内容,如果未能解决你的问题,请参考以下文章

python模块 zipfile

Python解压AES-128加密文件

Python zipfile 库 - 从一个目录创建一个仅包含 .pdf 和 .xml 文件的 zip

在内存中创建一个 Zip 文件

Java ZIP压缩文件使用总结

ZIP - 压缩文件实际上并不压缩文件