【问题标题】:How can I unpack multi-part archives (zip/rar) in Python?如何在 Python 中解压多部分档案(zip/rar)?
【发布时间】:2022-01-12 10:18:45
【问题描述】:

我有一个 2 GB 的存档文件(最好是 .zip 或 .rar)文件(假设 100 个部分 x 20MB),我正在尝试找到一种方法来正确解压缩它。我从一个 .zip 档案开始;我有 test.zip、test.z01、test.z02...test.99 等文件。当我像这样在 Python 中合并它们时:

for zipName in zips:
     with open(os.path.join(path_to_zip_file, "test.zip"), "ab") as f:
         with open(os.path.join(path_to_zip_file, zipName), "rb") as z:
             f.write(z.read())

然后,合并后,像thod一样解包

with zipfile.ZipFile(os.path.join(path_to_zip_file, "test.zip"), "r") as zipObj:
     zipObj.extractall(path_to_zip_file)

我得到错误,likr

test.zip 文件不是 zip 文件。

然后我尝试使用 .rar 存档。我试图仅解压缩第一个文件,以查看我的代码是否会智能地查找并提取剩余的存档片段,但它没有。所以我再次合并了 .rar 文件(就像在 .zip 案例中一样),然后尝试使用 patoolib 解压缩它:

patoolib.extract_archive("test.rar", outdir="path here")

当我这样做时,我会收到如下错误:

patoolib.util.PatoolError: 找不到可执行程序来提取格式 rar;候选人是 (rar,unrar,7z)

经过一番工作,我发现这些合并的文件已损坏(我复制了它并尝试使用 WinRAR 在 Windows 上正常解压缩,但遇到了一些问题)。所以我尝试了其他方法来合并,例如使用catcat test.part.* >test.rar,但这些都没有帮助。

如何在 Python 中正确合并和解压缩这些归档文件?

【问题讨论】:

  • 您不能简单地附加两个文件并假设它是一个有效的新文件。这个想法是解压缩/解压缩工具在给它这样一个集合的第一个文件时将自己处理多个文件。
  • @ThomasWeller 我试过了。只是存档库不支持这种操作。这也是 cat 不起作用的原因,可能这个 zip/rar 部分的一部分有一些应该跳过的标题等。
  • @MisterMiyagi 问题是你不明白这一点。在这种情况下,创建部件并不重要(它们是由 winrar 手动创建的)就像我说的那样,合并部件存在问题。
  • 我完全同意@MisterMiyagi。你最初是如何得到这些文件的?它们可能根本不是 ZIP 文件。我可以将一个 DOC 文件重命名为 Z01,无论你怎么努力,你都无法解压缩。
  • 正如我在第一条评论中所说:您可能根本不需要合并。

标签: python raspbian archive unpack


【解决方案1】:

从 python 中调用 7z

  1. .zip重命名为.zip.001,将.z01重命名为zip.002等等。
  2. 001 (7z x test.zip.001) 上拨打7z
import subprocess
cmd = ['7z', 'x', 'test.zip.001']
sp = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)

cat test.zip* > test.zip 也应该可以工作,但并不总是恕我直言。对单个文件进行了尝试并且可以工作,但子文件夹失败了。保持正确的顺序是强制性的。

测试:

7z -v1m a test.zip 12MFile
cat test.zip* > test.zip
7z t test.zip
>> Everything is Ok

无法检查“官方”WinRAR(这甚至还存在吗?!)或 WinZIP 文件。

在 Python 中合并文件

如果您想留在 python 中,这也可以(同样适用于我的 7z 测试文件..):

import shutil
import glob

with open('output_file.zip','wb') as wfd:
    for f in glob.glob('test.zip.*'): # Search for all files matching searchstring
        with open(f,'rb') as fd:
            shutil.copyfileobj(fd, wfd) # Concatinate

补充说明

  • pyunpack (python 前端) 和 patool (python 后端) 并安装了unrarp7zip-rar (7z 与 unfree rar-stuff) 用于 linux 或 7z 在 Windows 中可以处理 zip 和 rar (以及更多) 在 python 中
  • 有一个7z x -t 标志用于明确将其设置为拆分存档(如果文件未命名为 001 可能会有所帮助)。给例如7z x -trar.split7z x -tzip.split 什么的。

【讨论】:

  • 首先没有z00部分。其次,首先我检查了我合并排序的文件(以及那是什么顺序)。而且我的订单很好(我的意思是先 zip 然后 z01 等)。并且存档仍然损坏
  • 好的,抱歉,我测试过了,它可以工作。使用 rars 的工作更少,因为扩展是相同的,只需要选择第一部分。赏金给你
  • 顺便说一句,python 中没有支持 rar 扩展的 7z 库吗?
猜你喜欢
  • 2015-05-05
  • 2013-07-01
  • 2021-01-15
  • 1970-01-01
  • 2023-01-09
  • 2011-01-10
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
相关资源
最近更新 更多