使用Python提取多部分zip

时间:2019-02-11 22:06:54

标签: python zip multipart zipfile 7zip

我正在寻找一种在Windows上使用python提取多部分zip文件(例如blah.zip,blah.z01,blah.z02,blah.z03等)的方法,而无需进行任何先决条件安装(如7zip)。这个问题已经被问过了,但是唯一的回答是使用本地7zip安装,我宁愿避免这种安装,而且我没有足够的声誉在该线程中添加注释。

我正在使用python开发主要的功能的独立Windows桌面应用程序,其主要功能之一的重要部分是能够提取提供给它的zip文件。目前,我正在使用随该工具分发的便携式7zip(7za)进行此操作,但是由于新情况,我还需要支持多部分zip文件,而我似乎无法做到这一点。

我当前的代码很简单

subprocess.call('7za x -o"'+destinationPath+'" "'+zipPath+'"')

适用于普通zip,但对于多部分zip则什么也没有发生,通过在cmd中手动运行它,我得到输出

7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
Processing archive: zipname.zip
Error: Can not open file as archive

即使桌面7zip完全可以使用完全相同的存档来执行此操作。我是否缺少7za命令的语法?如果不是,除了要求用户确保已安装桌面7zip并尝试通过注册表等检测其位置之外,还有其他选择吗?

我也尝试使用python的Zipfile库,但这给了我

error: "BadZipFile: Bad magic number for file header"

由另一个线程指出。

非常感谢!

2 个答案:

答案 0 :(得分:0)

考虑到您正在使用subprocess.call(),这听起来更像是bash问题,而不是python问题。您可能想将cat的各个部分放在一起而不是解压缩,就像这样:

cat test.zip.* >test.zip
unzip test.zip

除了多个subprocess.call()

参见此处:https://unix.stackexchange.com/questions/40480/how-to-unzip-a-multipart-spanned-zip-on-linux

答案 1 :(得分:0)

我写了这段代码,基本上以二进制形式读取部分并将其附加到一个大的zip文件中。然后您可以提取它。

zips = os.listdir(zipPath)
for zipName in zips:
    with open(os.path.join(zipPath, "data.zip"), "ab") as f:
        with open(os.path.join(zipPath, zipName), "rb") as z:
            f.write(z.read())

with ZipFile(os.path.join(zipPath, "data.zip"), "r") as zipObj:
    zipObj.extractall(zipPath)