Senden mehrerer .CSV-Dateien an .ZIP, ohne sie in Python auf dem Datenträger zu speichern

8

Ich arbeite an einer Reporting-Anwendung für meine von Django betriebene Website. Ich möchte mehrere Berichte ausführen und für jeden Bericht eine CSV-Datei im Speicher generieren, die im Batch als ZIP-Datei heruntergeladen werden kann. Ich möchte dies tun, ohne irgendwelche Dateien auf der Festplatte zu speichern. Um eine einzige CSV-Datei zu generieren, befolge ich bisher die übliche Operation:

%Vor%

Das funktioniert gut, aber nur für eine einzelne, entpackte .csv. Wenn ich zum Beispiel eine Liste von .csv-Dateien hätte, die mit einem StringIO-Stream erstellt wurden:

%Vor%

Wie kann ich eine komprimierte Datei zurückgeben, die alle Objekte in myFiles enthält und richtig entpackt werden kann, um drei .csv-Dateien anzuzeigen?

    
Jamie Counsell 31.07.2014, 16:31
quelle

3 Antworten

12

zipfile ist ein Standardbibliotheksmodul, das genau das tut, wonach Sie suchen. Für Ihren Anwendungsfall ist das Fleisch und Kartoffeln eine Methode namens "writestr", die den Namen einer Datei und die darin enthaltenen Daten, die Sie gerne zippen möchten, verwendet.

Im folgenden Code habe ich ein sequenzielles Benennungsschema für die Dateien verwendet, wenn sie entpackt werden, aber das kann beliebig geändert werden.

%Vor%

Wenn Sie Ihren Code zukunftssicher machen möchten (Hinweishinweis Python 3-Hinweishinweis), können Sie auf io.BytesIO anstelle von StringIO, da es bei Python 3 nur um die Bytes geht. Ein weiterer Vorteil ist, dass explizite Suchvorgänge mit io.BytesIO vor dem Lesen nicht notwendig sind (ich habe dieses Verhalten nicht mit Djangos HttpResponse getestet, daher habe ich diesen finalen Suchvorgang dort gelassen, nur für den Fall).

%Vor%     
Dan Loewenherz 08.08.2014, 01:39
quelle
2

Das stdlib kommt mit dem Modul zipfile , und die Hauptklasse, ZipFile , akzeptiert eine Datei oder ein dateiähnliches Objekt:

%Vor%

Ich bin kein Benutzer von StringIO , daher kann es sein, dass seek und read fehl am Platz sind, aber hoffentlich bekommst du die Idee.

    
Ethan Furman 08.08.2014 01:24
quelle
1
%Vor%

StringIO hat getvalue Methode, die den gesamten Inhalt zurückgibt. Sie können die ZIP-Datei komprimieren von zipfile.ZipFile(outfile, 'w', zipfile.ZIP_DEFLATED) . Der Standardwert für die Komprimierung ist ZIP_STORED , wodurch eine Zip-Datei ohne Komprimierung erstellt wird.

    
ashwin 08.08.2014 05:56
quelle

Tags und Links