2015-04-24 27 views
5

App Engine'de çalışan bir komut dosyası üzerinde çalışıyorum, bu yüzden bağlı kalmam gereken RAM sınırlarına sahibim (sınırlayan uygulama motoruna özgü 1024 MB).Tüm zip dosyasını belleğe yüklemeden indirilmiş bir zip dosyasından dosya almanın yolu nedir?

Dosya listesini ayıklamam gereken büyük bir arşivi indiriyorum. Arşivin kendisi sadece daha sonra çevrimdışı kullanım için sakladığım bir dosyadır (gerekirse), ancak her indirdiğimde zip arşivindeki değişiklikleri aradığım için dosya listesine ihtiyacım var. belleğe tüm arşiv yerleştirerek oluyor, StringIO nesne ile

url = 'http://url.to/archive.zip' 
r = requests.get(url) 
file_mem = StringIO.StringIO(r.content) 
zip_file = zipfile.ZipFile(file_mem, 'r') 

# get the list of files 
file_list = zip_file.namelist() # list of files -- stored in memory 

: Burada

Şimdi sahip kod bloğudur. r.content nesnesinden, tüm dosyayı bir kerede belleğe yerleştirmeden bir dosya listesine gidebilmem için bir yol var mı?

cevap

0

Dosyayı diske karşıdan yükleme ve sonra da dosyayı ayrıştırmak için zipfile modülünü kullanma - bellekte .zip içeriklerini saklamak zorunda kalmamanızı ve küçük bir App Engine örneğinde iyi çalışmamayı umarım. .

import zipfile 
import urllib 

url = 'http://url.to/archive.zip' 
urllib.urlretrieve(url, 'archive.zip') 

with zipfile.ZipFile('archive.zip', 'r') as myzip: 
    print myzip.namelist() 
İlgili konular