我正在寻找一种在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"
由另一个线程指出。
非常感谢!
答案 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)