я не вижу, где вы объявляете zipf?
zipfile?Сентил Кумаран, вероятно, прав в zipstream, так как вы ищете (0) в zipstream перед циклом while для чтения фрагментов загадочной переменной.
edit:
Почти наверняка переменная - zipstream.
zipfile docs
:
класс zipfile.ZipFile (файл [, режим [, сжатие [, allowZip64]]])
Откройте файл ZIP, где файл может быть либо путем к файлу (строка), либо файловым объектом.Параметр mode должен иметь значение «r» для чтения существующего файла, «w» для усечения и записи нового файла или «a» для добавления к существующему файлу.Если режим «a» и файл ссылается на существующий ZIP-файл, то к нему добавляются дополнительные файлы.Если файл не ссылается на ZIP-файл, к нему добавляется новый ZIP-архив.Это предназначено для добавления ZIP-архива в другой файл (например, python.exe).
ваш код:
zipsteam=StringIO.StringIO()
создайте файлоподобный объект, используя StringIO, которыйпо сути, «файл памяти», читайте больше в docs
file = zipfile.ZipFile(zipstream,w)
открывает zip-файл с файловым объектом zipstream в режиме 'w'
url = 'http://www.koolbusiness.com/list.kml'
# repeat this for every URL that should be added to the zipfile
file =self.addFile(file,url,"list.kml")
# we have finished with the zip so package it up and write the directory
file.close()
использует метод addFile для извлечения и записи полученных данных в файлоподобный объект и возвращает их.Переменные слегка сбивают с толку, потому что вы передаете zip-файл методу addFile, который называется псевдонимом zipstream (сбивает с толку, потому что мы используем zipstream в качестве файлового объекта StringIO).В любом случае, zip-файл возвращается и закрывается, чтобы убедиться, что все «записано».
Он был записан в наш «файл памяти», который мы теперь стремимся индексировать 0
zipstream.seek(0)
и после того, как мы выполнили некоторые заголовки, мы наконец достигли цикла while, который будет читать наш «файл памяти» кусками
while True:
buf=zipstream.read(2048)
if buf=="": break
self.response.out.write(buf)