aus Vorhandener odt-Datei neue machen (zipfile)

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
anne_123
User
Beiträge: 2
Registriert: Donnerstag 25. August 2016, 15:22

Hallo Zusammen,

ich habe eine odt-Datei und möchte in dieser dynamisch die Werte ändern. Dazu habe habe ich mir bereits eine odt-Datei (vorlage.odt) gebastelt, diese entzipt und in die content.xml Platzhalter eingebaut. Mit dem Mako-Package möchte ich nun die Platzhalter in der content.xml befüllen. Das klappt auch soweit. Ich habe mir nun einen Ordner "ausgabe" erstellt, mit allen Datein der entzippten vorlage.odt ohne jedoch der content.xml. Nun möchte die neue, befüllte content.xml dort hinzufügen und dann wieder eine odt-Datei daraus machen (ausgabe.odt). Ich habe dazu folgendes versucht:

Code: Alles auswählen

from mako.template import Template
import zipfile

t = Template(filename='content_mit_platzhaltern.xml', input_encoding='utf-8')

x='test'
buff=(t.render(ne=x)) 

with zipfile.ZipFile('ausgabe.odt', 'w') as z: 	
	z.writestr('content.xml',buff)
leider funktioniert das noch nicht so gut. Er fügt die content.xml nicht zu dem Ordner hinzu.

Bin ein Python-Anfänger, kann mir vielleicht jemand helfen?

LG
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@anne_123: Was meinst Du mit "funktioniert nicht so gut"? Von welchem Ordner redest Du?

Der Dateimodus "w" erzeugt eine neue Zip-Datei. Um Dateien anzufügen, mußt Du den Dateimodus "a" verwenden.
anne_123
User
Beiträge: 2
Registriert: Donnerstag 25. August 2016, 15:22

Hallo Sirius3,

wenn ich das Skript so wie oben zu sehen ausführe, erstellt er nur eine ausgabe.odt datei, welche - wenn ich sie entzippe - nur die content.xml enthält. Auch wenn ich den Modus zu append (a) ändere ist das noch so.

Hat vielleicht noch jemand andere Ideen hierzu?

LG
anne_123
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Du willst also einen Ordner zippen?

Code: Alles auswählen

def write_dir_to_zipfile(path, zipf):
    for root, dirs, files in os.walk(path):
        for file_ in files:
            zipf.write(
                os.path.join(root, file_),
                os.path.relpath(os.path.join(root, file_), path)
            )

zip_path = os.path.join(directory, 'ausgabe.odt')
source_directory = os.path.join(directory, 'ausgabe')
with zipfile.ZipFile(zip_path, mode='w') as zipf: 
    write_dir_to_zipfile(source_directory, zipf)
    zipf.writestr('content.xml', buff)
the more they change the more they stay the same
Antworten