2008-09-18 10 views
9

Potrzebuję odczytać wybrane pliki, pasujące do nazwy pliku, ze zdalnego archiwum zip przy użyciu Pythona. Nie chcę zapisywać pełnego pliku ZIP w pliku tymczasowym (nie jest on zbyt duży, więc mogę obsłużyć wszystko w pamięci).Jak mogę odczytać wybrane pliki z zdalnego archiwum ZIP za pośrednictwem HTTP przy pomocy Pythona?

Już napisałem kod i działa, a ja odpowiadam sam, aby móc go później wyszukać. Ale ponieważ dowody sugerują, że jestem jednym z najgłupszych uczestników na Stackoverflow, jestem pewien, że jest miejsce na poprawę.

Odpowiedz

8

Oto jak to zrobiłem (chwytając wszystkie pliki kończące się na „.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 
+0

Chcesz zastąpić pierwszy wiersz: urllib2 import, na kartę SD. – Jim

+0

Dlaczego nie używasz 'ZipFile (urllib2.urlopen (url))'? – jfs

+0

Próbowałem tego, ale nie mogłem go uruchomić, ponieważ pomimo tego, że był obiektem podobnym do pliku, nie obsługiwał konkretnej funkcji wymaganej przez Zipfile. Dlatego buforowałem to cStringIO. –

2

Dziękuję Marcelowi za twoje pytanie i odpowiedź (miałem ten sam problem w innym kontekście i napotkałem na tę samą trudność z obiektami podobnymi do plików, które w rzeczywistości nie przypominają plików)! Podobnie jak w przypadku aktualizacji: W przypadku Pythona 3.0 kod musi zostać nieznacznie zmodyfikowany:

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 
Powiązane problemy