NameError: nom global n'est pas défini
Bonjour
Mon erreur est produite en générant un fichier zip. Pouvez-vous informer sur ce que je dois faire?
main.py", line 2289, in get
buf=zipf.read(2048)
NameError: global name 'zipf' is not defined
Le code complet est comme suit:
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)
if not self.request.get('count')==''
- sérieusement?not a == b
doit généralement êtrea != b
- merci pour la revue de code. Je suis à la base de l'apprentissage de python en provenance de Java arrière-plan, donc j'ai encore de la confusion à propos de
is
vs==
is
est un peu comme Java==
pour les objets (teste si a et b sont les mêmes),==
est plus commea.Equals(b)
. Fondamentalement, utilisez uniquementis
si vous voulez vraiment tester les deux objets étant le même ou un test si quelque chose n'est (si vous voulez juste tester pour un falsy valeur, il suffit de tester pournot a
)- c'est très utile à l'apprentissage de moi que. Merci pour toute l'aide!
Vous devez vous connecter pour publier un commentaire.
Qui est probablement
zipstream
et paszipf
. Donc, remplacez la parzipstream
et cela pourrait fonctionner.je ne vois pas où vous déclarez zipf?
zipfile? Senthil Kumaran est probablement droit à zipstream depuis que vous cherchez(0) sur zipstream avant la boucle while pour lire des morceaux de le mystère de la variable.
edit:
Presque certainement la variable est zipstream.
zipfile docs
:classe zipfile.ZipFile(fichier[, mode[, compression[, allowZip64]]])
votre code:
créer un fichier objet en forme à l'aide de StringIO qui est essentiellement une "mémoire le fichier" lisez-en plus sur
docs
ouvre la zipfile avec le zipstream fichier objet en forme de " w " mode
utilise la méthode addFile pour récupérer et d'écrire les données extraites du fichier-comme l'objet et le renvoie. Les variables sont un peu confus parce que vous passez un zipfile à la méthode addFile alias comme zipstream (à confusion, car nous sommes à l'aide de zipstream comme un StringIO fichier-comme l'objet). De toute façon, l'zipfile est retourné et fermé à s'assurer que tout est "écrit".
Il a été écrit pour notre "fichier de la mémoire", que nous allons maintenant chercher à l'index 0
et après avoir fait quelques en-tête de trucs, nous atteignons finalement la boucle while qui va lire notre "mémoire de fichier" en morceaux
Vous devez déclarer:
juste après votre
def get(self):
ligne. vous êtes en train de modifier une variable globale, et c'est la seule façon python sait ce que vous êtes en train de faire.