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
XML in xlsx-Archiv speichern
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.
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
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
- __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
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
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
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.
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.