您好 我的错误是在生成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)
答案 0 :(得分:3)
可能是zipstream
而不是zipf
。所以用zipstream
替换它可能会有效。
答案 1 :(得分:1)
我看不到你声明zipf的位置?
压缩文件? Senthil Kumaran可能是正确的zipstream,因为你在while循环之前在zipstream上寻找(0)来读取神秘变量的块。
编辑:
几乎可以肯定变量是zipstream。
class zipfile.ZipFile(file [,mode [,compression [,allowZip64]]])
打开一个ZIP文件,其中file可以是文件的路径(字符串)或 一个类似文件的对象。模式参数 应该'r'来阅读现有的 文件,'w'截断并写一个新的 文件,或'a'附加到现有的 文件。如果mode为'a'且文件引用 然后到现有的ZIP文件 其他文件添加到其中。如果 文件不引用ZIP文件, 然后附加一个新的ZIP存档 文件。这是为了添加一个 ZIP存档到另一个文件(例如 python.exe)。
您的代码:
zipsteam=StringIO.StringIO()
使用StringIO创建一个类似文件的对象,它本质上是一个“内存文件”,在docs
中读取更多内容
file = zipfile.ZipFile(zipstream,w)
以'w'模式
打开包含zipstream文件对象的zip文件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文件类对象)。无论如何,返回zipfile并关闭以确保所有内容都“已写入”。
它被写入我们的“记忆文件”,我们现在寻求索引0
zipstream.seek(0)
在做了一些标题之后,我们终于到达了将在块中读取“内存文件”的while循环
while True:
buf=zipstream.read(2048)
if buf=="": break
self.response.out.write(buf)
答案 2 :(得分:0)
您需要声明:
global zipf
在你之后
def get(self):
线。你正在修改一个全局变量,这是python知道你在做什么的唯一方法。