NameError: глобальное имя не определено - PullRequest
0 голосов
/ 15 апреля 2011

Hello Моя ошибка возникает при создании ZIP-файла. Не могли бы вы сообщить, что мне делать?

main.py", line 2289, in get
    buf=zipf.read(2048)
NameError: global name 'zipf' is not defined

Полный код выглядит следующим образом:

 def addFile(self,zipstream,url,fname):
     # get the contents          
     result = urlfetch.fetch(url)

     # store the contents in a stream
     f=StringIO.StringIO(result.content)
     length = result.headers['Content-Length']
     f.seek(0)

     # write the contents to the zip file
     while True:
       buff = f.read(int(length))
       if buff=="":break
       zipstream.writestr(fname,buff)
       return zipstream

 def get(self):   
    self.response.headers["Cache-Control"] = "public,max-age=%s" % 86400
    start=datetime.datetime.now()-timedelta(days=20)
    count = int(self.request.get('count')) if not self.request.get('count')=='' else 1000        
    from google.appengine.api import memcache
    memcache_key = "ads"
    data = memcache.get(memcache_key)
    if data is None:
      a= Ad.all().filter("modified >", start).filter("url IN", ['www.koolbusiness.com']).filter("published =", True).order("-modified").fetch(count)
      memcache.set("ads", a)  
    else:
      a = data
    dispatch='templates/kml.html'
    template_values = {'a': a , 'request':self.request,}
    path = os.path.join(os.path.dirname(__file__), dispatch)
    output = template.render(path, template_values)    
    self.response.headers['Content-Length'] = len(output)    
    zipstream=StringIO.StringIO()
    file = zipfile.ZipFile(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()
    zipstream.seek(0)
    # create and return the output stream
    self.response.headers['Content-Type'] ='application/zip'
    self.response.headers['Content-Disposition'] = 'attachment; filename="list.kmz"' 
    while True:
      buf=zipf.read(2048)
      if buf=="": break
    self.response.out.write(buf)

Ответы [ 3 ]

3 голосов
/ 15 апреля 2011

Это, вероятно, zipstream, а не zipf.Поэтому замените его на zipstream, и оно может сработать.

1 голос
/ 15 апреля 2011

я не вижу, где вы объявляете 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)
0 голосов
/ 15 апреля 2011

Вам необходимо объявить:

global zipf

сразу после вашей строки def get(self):

.вы изменяете глобальную переменную, и это единственный способ, которым Python знает, что вы делаете.

...