我需要使用Python從遠程zip存檔中讀取與文件名匹配的選定文件。我不想將完整的zip保存到一個臨時文件(它不是那麼大,所以我可以處理內存中的所有內容)。如何使用Python從遠程Zip歸檔通過HTTP讀取選定文件?
我已經編寫了代碼,它的工作原理,我自己回答,以便稍後可以搜索它。但是由於證據表明我是Stackoverflow的參與者之一,我相信還有改進的空間。
我需要使用Python從遠程zip存檔中讀取與文件名匹配的選定文件。我不想將完整的zip保存到一個臨時文件(它不是那麼大,所以我可以處理內存中的所有內容)。如何使用Python從遠程Zip歸檔通過HTTP讀取選定文件?
我已經編寫了代碼,它的工作原理,我自己回答,以便稍後可以搜索它。但是由於證據表明我是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
記住,只是解壓ZIP文件可能會導致a security vulnerability。
感謝馬塞爾提供的問題和答案(我在不同的環境中遇到了同樣的問題,並且遇到了類似文件的對象的相同難題,但並不像文件一樣)!正如更新:對於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文件!
要替換的第一行:進口的urllib2,zip文件。 – Jim 2008-09-18 17:08:51