2009-09-10 11 views
2

J'ai une vue qui prend des données de mon site, puis le transforme en un fichier compressé compressé. Voici mon code de travail sans zip:Je n'arrive pas à créer un fichier CSV dans un fichier ZIP dans django

def backup_to_csv(request): 
    response = HttpResponse(mimetype='text/csv') 
    response['Content-Disposition'] = 'attachment; filename=backup.csv' 

    writer = csv.writer(response, dialect='excel') 

    #code for writing csv file go here... 

    return response 

et cela fonctionne très bien. Maintenant, je veux que ce fichier soit compressé avant d'être envoyé. C'est là que je suis coincé.

def backup_to_csv(request): 

    output = StringIO.StringIO() ## temp output file 
    writer = csv.writer(output, dialect='excel') 

    #code for writing csv file go here... 

    response = HttpResponse(mimetype='application/zip') 
    response['Content-Disposition'] = 'attachment; filename=backup.csv.zip' 

    z = zipfile.ZipFile(response,'w') ## write zip to response 
    z.writestr("filename.csv", output) ## write csv file to zip 

    return response 

Mais ce n'est pas ça et je n'ai aucune idée de comment faire cela.

Répondre

5

OK Je l'ai eu. Voici ma nouvelle fonction:

def backup_to_csv(request): 

    output = StringIO.StringIO() ## temp output file 
    writer = csv.writer(output, dialect='excel') 

    #code for writing csv file go here... 

    response = HttpResponse(mimetype='application/zip') 
    response['Content-Disposition'] = 'attachment; filename=backup.csv.zip' 

    z = zipfile.ZipFile(response,'w') ## write zip to response 
    z.writestr("filename.csv", output.getvalue()) ## write csv file to zip 

    return response 
+0

Oui, cela fonctionnera (si la sortie non compressée s'intègre bien dans la mémoire, sinon, considérez un fichier temporaire sur le disque). –

5

Notez comment, dans le cas de travail, vous return response ... et dans le cas de non-travail vous revenez z, qui est pas un HttpResponse bien sûr (alors qu'il devrait être!). Donc: utilisez votre csv_writer PAS sur response mais sur un fichier temporaire; zip le fichier temporaire; et écrire QUE compressé par octets dans le response!

+0

Ok , J'ai mis à jour mon OP pour refléter ce que je pense que vous dites ici, mais il y a encore quelque chose qui me manque: j'obtiens un AttributeError disant "StringIO n'a pas de méthode __len__" Dois-je utiliser autre chose que StringIO pour écrire le csv à? – priestc

+0

Pour extraire la valeur de chaîne d'une instance StringIO (donc vous pouvez obtenir son 'len' etc etc), utilisez' thestringioinstance.getvalue() 'une fois que vous avez fini d'écrire (et avant de le fermer!). –

1
zipfile.ZipFile(response,'w') 

ne semble pas fonctionner en python 2.7.9. Le réponse est un django.HttpResponse objet (qui est dit être-fichier), mais il donne une erreur « objet HttpResponse ne dispose pas d'un attribut « chercher ». Lorsque le code est exécuté en python 2.7.0 ou 2.7.6 (je ne l'ai pas testé dans d'autres versions) c'est OK ... Donc vous feriez mieux de le tester avec python 2.7.9 et de voir si vous obtenez le même comportement

Questions connexes