Seite 1 von 1

aus Vorhandener odt-Datei neue machen (zipfile)

Verfasst: Donnerstag 25. August 2016, 15:42
von anne_123
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

Re: aus Vorhandener odt-Datei neue machen (zipfile)

Verfasst: Donnerstag 25. August 2016, 16:08
von Sirius3
@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.

Re: aus Vorhandener odt-Datei neue machen (zipfile)

Verfasst: Samstag 27. August 2016, 08:07
von anne_123
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

Re: aus Vorhandener odt-Datei neue machen (zipfile)

Verfasst: Samstag 27. August 2016, 09:11
von Dav1d
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)