2016-11-01 47 views
0

我使用下面的代码读取数据:如何从一个网站上的一个zip文件没有下载本地zip文件

import zipfile 
import urllib 

link = "http://www.dummypage.com/dummyfile.zip" 
file_handle = urllib.urlopen(link) 
zip_file_object = zipfile.ZipFile(file_handle, 'r') 

我得到执行下面的错误。请帮忙。

Traceback (most recent call last): 
    File "fcc.py", line 34, in <module> 
    zip_file_object = zipfile.ZipFile(file_handle) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 770, in __init__ 
    self._RealGetContents() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 807, in _RealGetContents 
    endrec = _EndRecData(fp) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 208, in _EndRecData 
    fpin.seek(0, 2) 
AttributeError: addinfourl instance has no attribute 'seek' 
+0

'ZipFile'需要类似文件的对象与'求()'函数和'urlopen'不产生文件类对象。使用'io.ByteIO'在内存中创建类似文件的对象,并将来自因特网的数据放入此对象中。 – furas

回答

1

您需要一个流处理函数接口来处理内存中的数据。对于文本数据,最常用的库是StringIO。对于二进制数据,右边的库是io

import io 
import urllib 
import zipfile 

link = "http://www.dummypage.com/dummyfile.zip" 
file_handle = io.BytesIO(urllib.urlopen(link).read()) 
zip_file_object = zipfile.ZipFile(file_handle, 'r') 

问题是,该文件的下载确实完成,但它会在临时文件夹中。你不需要关心它

+0

谢谢一吨毛罗。最后我的脚本正在工作。我很受伤! –

0

你可以使用外部工具吗? @ruario对Bash - how to unzip a piped zip file (from “wget -qO-”)的回答非常有趣。基本上,zip将其目录存储在该文件的末尾,并且zip工具倾向于需要整个文件才能进入该目录。但是,zip也包含内联头文件,一些工具可以使用这些头文件。如果你不介意的呼唤bsdtar(或其他工具),你可以这样做:

import urllib 
import shutil 
import subprocess as subp 

url_handle = urllib.urlopen("test.zip") 
proc = subp.Popen(['bsdtar', '-xf-'], stdin=subp.PIPE) 
shutil.copyfileobj(url_handle, proc.stdin) 
proc.stdin.close() 
proc.wait()