gpt4 book ai didi

python - 如何从 Python 中的 zip 文件中读取 zip 文件?

转载 作者:IT老高 更新时间:2023-10-28 21:58:00 24 4
gpt4 key购买 nike

我有一个我想阅读的文件,它本身压缩在一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com