XML in xlsx-Archiv speichern

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
MaxiB
User
Beiträge: 3
Registriert: Sonntag 3. Juni 2018, 17:32

Hallo Zusammen,

im folgenden würde ich gerne die veränderte xml.rels-Datei in einem zuvor entpacktem xlxs-Archiv speichern. Dabei habe ich zwei Porbleme, die ich nach längere Suche nicht lösen konnte.
1. Beim Speichern einer xml.rls Datei ist der Inhalt der Datei leer. Nur beim Speichern einer xml-Datei erfolgt das Speichern wie gewünscht.
2. Es ist mir nicht gelungen die Datei im geöffneten xlsx-Archiv zu speichern, da der interne Pfad des entpackten xlsx-Archiv nicht erkannt wird.

Ich würde mich über Hilfe sehr freuen. Vielen Dank.

import tkinter as tk
from zipfile import ZipFile
import xml.etree.ElementTree as ET

root = tk.Tk()
root.withdraw()
file_path = 'Z:/data.xlsx'
with ZipFile(file_path) as myzip:
my_file = myzip.open('xl/externalLinks/_rels/externalLink1.xml.rels')
tree = ET.parse(my_file)
root = tree.getroot()
for child_of_root in root:
ATarget=child_of_root.attrib
ATarget["Target"]="test1234.xlsx"

tree.write('xl/externalLinks/_rels/externalLink1test.xml.rls') # Hier ist der obenbeschriebene Fehler
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

Was meinst Du mit »ist der Inhalt leer«? Entweder Du schreibst etwas in eine Datei oder nicht. Wenn Du etwas in eine Zip-Datei schreiben willst, mußt Du sie zum Schreiben öffnen. Wenn Du etwas in eine Zip-Datei schreiben willst, mußt Du den ElementTree erst in einen String umwandeln damit Du ihn dann mit `ZipFile.writestr` schreiben kannst.
MaxiB
User
Beiträge: 3
Registriert: Sonntag 3. Juni 2018, 17:32

Hey,

vielen Dank! Du hast mir damit schon sehr geholfen. Allerdings habe ich noch ein kleines Porblem mit ZipFile.writestr() (Error: writestr() missing 1 required positional argument: 'data')). Den compress-type hatte ich auch schon angegeben. Kannst Du mir nochmal weiterhelfen?

from zipfile import ZipFile
import xml.etree.ElementTree as ET

root = tk.Tk()
root.withdraw()
file_path = 'C:/Users/Max/Desktop/data.xlsx'


with ZipFile(file_path) as myzip:

my_file = myzip.open('xl/externalLinks/_rels/externalLink1.xml.rels')
tree = ET.parse(my_file)
root = tree.getroot()

for child_of_root in root:
ATarget=child_of_root.attrib
ATarget["Target"]="test1234.xlsx"

xmlstr = ET.tostring(root, encoding='utf8', method='xml')
ZipFile.writestr("/xl/externalLinks/_rels/externalLink1test.xml.rels",xmlstr) # hier entsteht der Fehler
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@MaxiB: Du versuchst da die Methode auf der Klasse aufzurufen und nicht auf einem Exemplar. Frag Dich doch mal selbst in welche ZIP-Datei das geschrieben werden soll und woher Python das wissen soll‽
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
MaxiB
User
Beiträge: 3
Registriert: Sonntag 3. Juni 2018, 17:32

Hallo,

danke für die Antwort,aber ich kann dir leider nicht ganz folgen. Vielleicht weil die Einschübe nicht richtig aufgezeigt sind in den vorherigen Beiträgen. Das Archiv ist geöffnet und der String müssten gepseichert werden können in das weiterhin geöffnet Archiv data.xlsx. Vielleicht bin ich blind aber ich sehe den Fehler nicht. Ich wäre echt dankbar für deine Hilfe.


from zipfile import ZipFile
import xml.etree.ElementTree as ET

root = tk.Tk()
root.withdraw()
file_path = 'C:/Users/Max/Desktop/data.xlsx'

with ZipFile(file_path) as myzip:

my_file = myzip.open('xl/externalLinks/_rels/externalLink1.xml.rels')
tree = ET.parse(my_file)
root = tree.getroot()

for child_of_root in root:
ATarget=child_of_root.attrib
ATarget["Target"]="test1234.xlsx"

xmlstr = ET.tostring(root, encoding='utf8', method='xml')
ZipFile.writestr("/xl/externalLinks/_rels/externalLink1test.xml.rels",xmlstr) # hier entsteht der Fehler
__deets__
User
Beiträge: 14538
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte Code-Tags benutzen.

Und du musst myzip verwenden. ZipFile ist ein Konstruktor fuer ein neues Objekt. So wie BMW318i der Name eines Automodells ist. Aber myzip ist die konkrete Instanz. So wie meine_ranz_karre *mein* Auto ist. Oder sein koennte, isch 'abe gar kein Auto.
Antworten