我需要使用 Python 从远程 zip 存档中读取与文件名匹配的选定文件。我不想将完整的 zip 保存到临时文件中(它不是那么大,所以我可以处理内存中的所有内容)。
我已经编写了代码并且它可以工作,我自己回答这个问题,以便我以后可以搜索它。但既然有证据表明我是 Stackoverflow 上比较笨的参与者之一,我相信还有改进的余地。
我是这样做的(获取所有以“.ranks”结尾的文件):
import urllib2, cStringIO, zipfile
try:
remotezip = urllib2.urlopen(url)
zipinmemory = cStringIO.StringIO(remotezip.read())
zip = zipfile.ZipFile(zipinmemory)
for fn in zip.namelist():
if fn.endswith(".ranks"):
ranks_data = zip.read(fn)
for line in ranks_data.split("\n"):
# do something with each line
except urllib2.HTTPError:
# handle exception
感谢 Marcel 的提问和回答(我在不同的上下文中遇到了同样的问题,并且在类似文件的对象不是真正类似文件的情况下遇到了同样的困难)!作为更新:对于 Python 3.0,您的代码需要稍作修改:
import urllib.request, io, zipfile
try:
remotezip = urllib.request.urlopen(url)
zipinmemory = io.BytesIO(remotezip.read())
zip = zipfile.ZipFile(zipinmemory)
for fn in zip.namelist():
if fn.endswith(".ranks"):
ranks_data = zip.read(fn)
for line in ranks_data.split("\n"):
# do something with each line
except urllib.request.HTTPError:
# handle exception
这将在不下载整个 zip 文件的情况下完成这项工作!
请记住,仅解压缩 ZIP 文件可能会导致安全漏洞。