ich habe ein Problem mit pathlib und dem schreiben einer .xml Datei über einen durch pathlib erzeugten Pfad.
Code: Alles auswählen
import os
from pathlib import Path
from lxml import etree
import csv
datenverzeichnis = Path.cwd() / "daten"
original_datei = "original.txt"
original_datei_pfad = datenverzeichnis / original_datei
def erzeuge_xml_ospath(original_datei_pfad):
xml_dateiname = "12345.xml"
os_pfad = os.path.join(os.path.dirname(__file__)) + "/daten/" + xml_dateiname
with open(original_datei_pfad, "r", encoding="utf-8") as import_datei:
eingabe = csv.reader(import_datei, delimiter="\t")
next(eingabe)
root = etree.Element("root")
name = etree.SubElement(root, "Name")
etree.SubElement(name, "ID").text = "ID"
et = etree.ElementTree(root)
et.write(os_pfad, xml_declaration=True, encoding='UTF-8', pretty_print=True)
def erzeuge_xml_pathlib(original_datei_pfad, datenverzeichnis):
xml_dateiname = "12345.xml"
pathlib_pfad = datenverzeichnis / xml_dateiname
with open(original_datei_pfad, "r", encoding="utf-8") as import_datei:
eingabe = csv.reader(import_datei, delimiter="\t")
next(eingabe)
root = etree.Element("root")
name = etree.SubElement(root, "Name")
etree.SubElement(name, "ID").text = "ID"
tree = root.getroottree()
tree.write(pathlib_pfad, xml_declaration=True, encoding='UTF-8', pretty_print=True)
erzeuge_xml_ospath(original_datei_pfad)
erzeuge_xml_pathlib(original_datei_pfad, datenverzeichnis)
C:/Users/user/daten/12345.xml
Die Funktion läuft durch und erzeugt die Datei am richtigen Ort.
"erzeuge_xml_pathlib" erstellt einen Pfad für die .xml wie folgt:
C:\Users\user\daten\12345.xml
Die Fuktion bricht ab und bringt folgende Fehlermeldung:
TypeError: File or filename expected, got 'WindowsPath'
Noch kurz eine Frage zur lxml write Klasse. Welche ist besser zu verwenden, oder sind beide Schreibweisen ok?
Code: Alles auswählen
et = etree.ElementTree(root)
et.write(os_pfad, xml_declaration=True, encoding='UTF-8', pretty_print=True)
# oder
tree = root.getroottree()
tree.write(pathlib_pfad, xml_declaration=True, encoding='UTF-8', pretty_print=True)