我正在寻找一种在 python 中解压缩嵌套 zip 文件的方法。例如,考虑以下结构(为方便起见,使用假设名称):
- 文件夹
- ZipfileA.zip
- 压缩文件A1.zip
- 压缩文件A2.zip
- ZipfileB.zip
- 压缩文件B1.zip
- 压缩文件B2.zip
- ZipfileA.zip
...等等我正在尝试访问第二个 zip 中的文本文件。我当然不想提取所有内容,因为剪切数字会使计算机崩溃(第一层有数百个 zip,第二层有近 10,000 个(每个 zip))。
我一直在玩“zipfile”模块——我可以打开第一级 zipfiles。例如:
zipfile_obj = zipfile.ZipFile("/Folder/ZipfileA.zip")
next_layer_zip = zipfile_obj.open("ZipfileA1.zip")
但是,这会返回一个“ZipExtFile”实例(不是文件或 zipfile 实例)- 然后我无法继续打开此特定数据类型。我不能这样做:
data = next_layer_zip.open(data.txt)
不过,我可以通过以下方式“读取”此 zip 文件:
next_layer_zip.read()
但这完全没用! (即只能读取压缩数据/goobledigook)。
有没有人对我如何解决这个问题有任何想法(不使用 ZipFile.extract)?
我遇到了这个,http://pypi.python.org/pypi/zip_open/ - 它看起来完全符合我的要求,但它似乎对我不起作用。 (对于我尝试使用该模块处理的文件,不断收到“[Errno 2] 没有这样的文件或目录:”)。
任何想法将不胜感激!!提前致谢
最佳答案
ZipFile 需要一个类似文件的对象,因此您可以使用 StringIO 将从嵌套 zip 中读取的数据变成这样一个对象。需要注意的是,您会将完整(仍然压缩)的内部 zip 加载到内存中。
with zipfile.ZipFile('foo.zip') as z:
with z.open('nested.zip') as z2:
z2_filedata = cStringIO.StringIO(z2.read())
with zipfile.ZipFile(z2_filedata) as nested_zip:
print nested_zip.open('data.txt').read()
关于python - 在 python 中解压嵌套的 zip 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11930515/