Das von Ethier bereitgestellte Beispiel weist mehrere Probleme auf, von denen einige schwerwiegend sind:
- funktioniert nicht für echte Daten unter Windows. Eine ZIP-Datei ist binär und ihre Daten sollten immer mit einer geöffneten Datei 'wb' geschrieben werden.
- Die ZIP-Datei wird für jede Datei angehängt. Dies ist ineffizient. Es kann einfach geöffnet und als
InMemoryZip
Attribut beibehalten werden
- In der Dokumentation heißt es, dass ZIP-Dateien explizit geschlossen werden sollten. Dies erfolgt nicht in der Append-Funktion (dies funktioniert wahrscheinlich (zum Beispiel), da zf den Gültigkeitsbereich verlässt und die ZIP-Datei geschlossen wird.)
- Das Flag create_system wird für alle Dateien in der Zip- Datei jedes Mal gesetzt, wenn eine Datei angehängt wird, anstatt nur einmal pro Datei.
- unter Python <3 ist cStringIO viel effizienter als StringIO
- funktioniert nicht mit Python 3 (der ursprüngliche Artikel stammt aus der Zeit vor der Veröffentlichung von 3.0, aber als der Code veröffentlicht wurde, war 3.1 schon lange nicht mehr verfügbar).
Eine aktualisierte Version ist verfügbar, wenn Sie installieren ruamel.std.zipfile
(von denen ich der Autor bin). Nach
pip install ruamel.std.zipfile
oder den Code für die Klasse einschließlich von hier können Sie tun:
import ruamel.std.zipfile as zipfile
zipfile.InMemoryZipFile()
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
imz.writetofile("test.zip")
Alternativ können Sie den Inhalt imz.data
an einen beliebigen Ort schreiben .
Sie können die with
Anweisung auch verwenden. Wenn Sie einen Dateinamen angeben, wird der Inhalt der ZIP-Datei beim Verlassen dieses Kontexts geschrieben:
with zipfile.InMemoryZipFile('test.zip') as imz:
imz.append("test.txt", "Another test").append("test2.txt", "Still another")
Aufgrund des verzögerten Schreibens auf eine Disc können Sie test.zip
in diesem Kontext tatsächlich von einem alten lesen .