作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个我想阅读的文件,它本身压缩在一个 zip 存档中。例如,parent.zip 包含 child.zip,其中包含 child.txt。我在阅读 child.zip 时遇到问题。谁能更正我的代码?
我假设我需要将 child.zip 创建为类似文件的对象,然后使用第二个 zipfile 实例打开它,但是对于 python 来说,我的 zipfile.ZipFile(zfile.open(name)) 很愚蠢。它会在(独立验证的)child.zip 上引发一个 zipfile.BadZipfile: "File is not a zip file"
import zipfile
with zipfile.ZipFile("parent.zip", "r") as zfile:
for name in zfile.namelist():
if re.search(r'\.zip$', name) is not None:
# We have a zip within a zip
with **zipfile.ZipFile(zfile.open(name))** as zfile2:
for name2 in zfile2.namelist():
# Now we can extract
logging.info( "Found internal internal file: " + name2)
print "Processing code goes here"
最佳答案
当您对 ZipFile
实例使用 .open()
调用时,您确实会获得一个打开的文件句柄。但是,要读取 zip 文件,ZipFile
类还需要多一点。它需要能够在该文件上 seek,并且 .open()
返回的对象在您的情况下是不可搜索的。只有 Python 3(3.2 及更高版本)生成支持查找的 ZipExFile
对象(前提是外部 zip 文件的底层文件句柄是可查找的,并且没有尝试写入 ZipFile
对象)。
解决方法是使用 .read()
将整个 zip 条目读取到内存中,将其存储在 BytesIO
对象(是可搜索的)并将其提供给ZipFile
:
from io import BytesIO
# ...
zfiledata = BytesIO(zfile.read(name))
with zipfile.ZipFile(zfiledata) as zfile2:
或者,在你的例子中:
import zipfile
from io import BytesIO
with zipfile.ZipFile("parent.zip", "r") as zfile:
for name in zfile.namelist():
if re.search(r'\.zip$', name) is not None:
# We have a zip within a zip
zfiledata = BytesIO(zfile.read(name))
with zipfile.ZipFile(zfiledata) as zfile2:
for name2 in zfile2.namelist():
# Now we can extract
logging.info( "Found internal internal file: " + name2)
print "Processing code goes here"
关于python - 如何从 Python 中的 zip 文件中读取 zip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12025469/
我是一名优秀的程序员,十分优秀!