ZipFile an Datei ersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hallo zusammen,

ich arbeite mit zipfile und entpackte aus einem vorhandenen Zipfile eine Datei, manipuliere diese und schreibe diese mit.write zurück.

Leider habe ich noch das Problem, das alte Datei aus dem Zipfile (bzw. im zipfile), noch im archiv ist. Diese Datei wird allerdings bei write nicht ersetzt (ok so stehts ja in der Api)

Zusätzlich wird das File außerhalb des zipfiles auch noch behalten, was natürlich auch unschön ist.

Wie löse ich dieses writeBack-Problem? Unter http://docs.python.org/library/zipfile.html habe ich leider nichts gefunden was mir das löschen bzw. überschreiben einer Datei im Zipfile ermöglichen würde.

Habe bereits den Gockel laufen lassen, Fehler scheint bekannt aber leider keine Lösung.

Danke für die Hilfe.

Anbei Codeabschnitt, falls relevant

Code: Alles auswählen

ofile.saveFile("outputFile")
    ofile.escapeConvert("outputFile")
    
    import zipfile
    f = zipfile.ZipFile("outputFile.odt", "a")
    
    f.extract("content.xml")
    with open("content.xml") as h:
        data = h.read().replace("</office:text>", "%s </office:text>"%odfReturn)
    with open("content.xml", "w") as h:
        h.write(data)

    f.write("content.xml")
    f.close()
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Zipfile X erstellen und alles, was du aus deinem alten Zipfile Z behalten möchtest nach X schreiben. Dann schreibst du in X noch die neue manipulierte, löscht Z und benennst X in Z um.
Das Leben ist wie ein Tennisball.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Doch so komfortabel :roll:

Dank dir, mach ich.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

Hallo,

ich muss die kalte Suppe leider doch nochmal aufwärmen.

Momentan entpacke ich alle Files (extractall()) und gehe über meine Liste (namelist) durch die
Dokumente durch und schreibe Sie in mein neues Zipfile, und lösche den alten Rest. (der file manager freut sich)

Das ganze mach ich mit odf Dateien. Ich wollte nochmal nachfragen, ob es da nicht wirklich
was "performanteres" gibt? Weil, wenn ich z.b. ein Report erstelle, kann das vorkommen das ich
diesen "workflow" über hundert mal machen muss.
Ja, jetzt kommt der Einspruch. "Warum nicht erst zusammen bauen und dann einmal wegschreiben?"

[offtopic]
Ich nutze zur Ansteuerung von den user-fields sowie dem Aufbau der Dokumentstruktur odfpy, dieses
kann allerdings keinen kompletten xml-Block in das Dokument schreiben (nur als createTextNode).
Deswegen muss ich erst mit odfy die "Blockstruktur" aufbauen und dann schreiben ich einen XML Block
(aus der Db) in das content.xml. Und dann schreibe ich wieder einen neuen Block....
[/offtopic]

Deswegen ist es leider nur bedingt möglich erst den kompletten Dokumentinhalt aufzubauen, wenn ich
komplett umschreibe, würde das wohl mit caching und Aufwand realisierbar sein.

Deswegen ungeachtet der vielen Warmen luft meinerseits zuvor, gibt es nichts "leichters"/schnellers um
eine Datei in einem Zipfile zu überschreiben? (gern auch eine architekturebene unter dem file manager)

Grüße und vielen Dank
Benutzeravatar
DaMutz
User
Beiträge: 202
Registriert: Freitag 31. Oktober 2008, 17:25

kannst du das Zip File nicht komplett in den Speicher entpacken und dann die ganze Geschichte im Speicher erledigen und am Schluss wieder als File speichern. Um Dateien im Speicher zu halten gibt es das StringIO Modul.
rads
User
Beiträge: 153
Registriert: Freitag 26. März 2010, 15:51

wäre momentan nicht möglich,

ODFPY braucht den File-Handle (write) und der zipfile-Zugriff natürlich auch. Dachte das es da eigentlich sicherlich was komfortableres gibt, aber ansonsten werde ich es wohl irgendwie zwischenspeichern müssen. Aber momentan ist die Leistung sonst schon sehr, eh "unangebracht".
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo!
rads hat geschrieben:wäre momentan nicht möglich,
ODFPY braucht den File-Handle (write) und der zipfile-Zugriff natürlich auch.
Dann schau dir doch mal StringIO an und die Dokumentation zu zipfile und odfpy:
StringIO hat geschrieben:This module implements a file-like class, StringIO, that reads and writes a string buffer (also known as memory files). See the description of file objects for operations (section File Objects). (For standard strings, see str and unicode.)
zipfile hat geschrieben:class zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
Open a ZIP file, where file can be either a path to a file (a string) or a file-like object.
odfpy hat geschrieben:write(fileobject) Writes the document to a file-like object of the type available from StringIO.
Sebastian
Das Leben ist wie ein Tennisball.
Antworten