使用Python解压多部分zip文件

6
我正在寻找一种使用Python在Windows上提取多部分zip文件(例如blah.zip,blah.z01,blah.z02,blah.z03等)的方法,而不需要任何预先安装的软件(如7zip)。这个问题已经被问过了,但是唯一的答案是使用本地的7zip安装,我宁愿避免这样做,而且我没有足够的声望在那个线程中添加评论。
我正在使用Python开发一个独立的Windows桌面应用程序,主要功能使用Python实现,其中一个重要功能的一个重要部分是能够提取给定的zip文件。目前,我使用随工具分发的便携式7zip(7za)来完成这个任务,但由于新情况的出现,我还需要支持多部分zip文件,但似乎无法做到。
我的当前代码只是:
subprocess.call('7za x -o"'+destinationPath+'" "'+zipPath+'"')

这段代码适用于普通的zip文件,但对于多部分zip文件则无法正常工作。通过手动在命令提示符中运行,可以得到输出结果。

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"

正如其他帖子所指出的那样。

非常感谢您提前的帮助!


1
你解决了吗? - KyluAce
2个回答

2

OP正在使用Windows,而不是Linux。 - C.Nivs
好主意 —— 通用技巧可能仍然有效吗?将文件连接起来,然后解压缩结果? - Aviv Goldgeier
那么,如果我直接在Python中以二进制方式打开文件并将它们串联起来,最终会得到一个可用的zip文件吗?虽然速度可能不快,但如果这就是它的工作方式,那么这是一个选择。我尝试使用Windows的copy file.zip + file.z01 + file.z02 outputfile.zip语法,但输出的是一个3kb无法读取的zip文件。 - TheCatOfWar
我想应该可以。使用bytesIO可能可以实现,因为它可以充当文件处理程序。唯一的问题可能是每个.zip归档中的EOF标记。 - C.Nivs
在Windows和MS-DOS中,您可以使用类似于“copy file.zip.part1 + file.zip.part1 + file.zip.part1 file.zip”的命令。 - Lee

-2

我写了这段代码,基本上是将部分内容以二进制形式读取并附加到一个大的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)

当我使用“part”将文件合并成一个大文件时,它会损坏压缩文件,然后就无法解压缩,因为文件是错误的。 - KyluAce
也许你的压缩文件不是多部分的压缩文件,多部分的压缩文件基本上是将一个大的压缩文件分割成多个部分,也许你的压缩文件只是单独的压缩文件。 - Guven Degirmenci
他们是。我使用Windows创建了多部分zip文件。文件名为Test.zip,Test.z01 ... Test.z80。就像我所说的,当我合并它们时,文件会损坏。这可能是因为扩展名不同(zip、z01等)。 - KyluAce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接