2016-11-01 48 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()