generando un archivo CSV en línea en Google App Engine

Estoy usando Google App Engine (python), quiero que mis usuarios puedan descargar un archivo CSV generado usando algunos datos del almacén de datos (pero no quiero que descarguen todo el archivo, ya que reordené las columnas y esas cosas).

Tengo que usar el módulo csv, porque puede haber celdas que contengan comas. Pero el problema es que si hago eso, necesitaré escribir un archivo, lo cual no está permitido en Google App Engine.

Lo que tengo actualmente es algo como esto:

tmp = open("tmp.csv", 'w') writer = csv.writer(tmp) writer.writerow(["foo", "foo,bar", "bar"]) 

Así que supongo que lo que querría hacer es manejar celdas con comas o usar el módulo csv sin escribir un archivo, ya que esto no es posible con GAE.

¡Encontré una manera de usar el módulo CSV en GAE! Aquí está:

 self.response.headers['Content-Type'] = 'application/csv' writer = csv.writer(self.response.out) writer.writerow(["foo", "foo,bar", "bar"]) 

De esta manera no necesitas escribir ningún archivo.

Aquí hay un ejemplo completo del uso del módulo CSV de Python en GAE. Normalmente lo uso para crear un archivo csv a partir de una consulta gql y pedirle al usuario que lo guarde o lo abra.

 import csv class MyDownloadHandler(webapp2.RequestHandler): def get(self): q = ModelName.gql("WHERE foo = 'bar' ORDER BY date ASC") reqs = q.fetch(1000) self.response.headers['Content-Type'] = 'text/csv' self.response.headers['Content-Disposition'] = 'attachment; filename=studenttransreqs.csv' writer = csv.writer(self.response.out) 

crear tags de fila

  writer.writerow(['Date', 'Time','User' ]) 

iterar a través de la consulta devolviendo cada instancia como una fila

  for req in reqs: writer.writerow([req.date,req.time,req.user]) 

Agregue la asignación apropiada para que cuando se haga clic en un enlace, se abra el cuadro de diálogo del archivo

 ('/mydownloadhandler',MyDownloadHandler), 
 import StringIO tmp = StringIO.StringIO() writer = csv.writer(tmp) writer.writerow(["foo", "foo,bar", "bar"]) contents = tmp.getvalue() tmp.close() print contents