ElementTree write liefert SystemError
Verfasst: Dienstag 2. April 2019, 09:43
Liebe alle,
mir ist kein besserer Titel für das Thema eingefallen, für Verbesserungsvorschläge bin ich zu haben.
Ich habe mir vor einiger Zeit eine Funktion geschrieben, die eine Dateiliste mit XML-Dateien einliest und die Dateien nach einem bestimmten XML-Knoten durchsucht. Die Ergebnisse schreibe ich in einen neuen XML-Tree, denn ich dann mittels tree.write() in eine neue Datei geschrieben habe. Das hatte auch alles soweit funktioniert. Seit gestern bekomme ich dabei allerdings den folgenden Fehler:
Ich verstehe den Fehler so, dass beim Versuch den Baum in die Datei zu schreiben ein fehlerhafter Wert aus dem Dictionary, welches die Elemente enthält, an die Funktion zum Schreiben an die Datei übergeben wird. Meine Versuche den Fehler weiter einzugrenzen haben mich leider nicht weiter gebracht, auch online bin ich nicht fündig geworden. Mich irritiert, dass eben dieses Prozedere mit denselben Dateien als Ausgangsbasis schon fehlerfrei funktioniert hat.
Die Funktion, die ich zum erzeugen der Analyse.xml nutze:
mir ist kein besserer Titel für das Thema eingefallen, für Verbesserungsvorschläge bin ich zu haben.
Ich habe mir vor einiger Zeit eine Funktion geschrieben, die eine Dateiliste mit XML-Dateien einliest und die Dateien nach einem bestimmten XML-Knoten durchsucht. Die Ergebnisse schreibe ich in einen neuen XML-Tree, denn ich dann mittels tree.write() in eine neue Datei geschrieben habe. Das hatte auch alles soweit funktioniert. Seit gestern bekomme ich dabei allerdings den folgenden Fehler:
Code: Alles auswählen
In [58]: tree.write('xxxxxxxxxxxxx\Analyse_docAuthor_02.04.2019.xml')
---------------------------------------------------------------------------
SystemError Traceback (most recent call last)
<ipython-input-58-e7b673c0da16> in <module>()
----> 1 tree.write('xxxxxxxxxxxxx\Analyse_docAuthor_02.04.2019.xml')
c:\python\python36-32\lib\xml\etree\ElementTree.py in write(self, file_or_filena
me, encoding, xml_declaration, default_namespace, method, short_empty_elements)
771 _serialize_text(write, self._root)
772 else:
--> 773 qnames, namespaces = _namespaces(self._root, default_namespace)
774 serialize = _serialize[method]
775 serialize(write, self._root, qnames, namespaces,
c:\python\python36-32\lib\xml\etree\ElementTree.py in _namespaces(elem, default_
namespace)
884 elif tag is not None and tag is not Comment and tag is not PI:
885 _raise_serialization_error(tag)
--> 886 for key, value in elem.items():
887 if isinstance(key, QName):
888 key = key.text
SystemError: ..\Objects\dictobject.c:2708: bad argument to internal function
Die Funktion, die ich zum erzeugen der Analyse.xml nutze:
Code: Alles auswählen
def findInstances(fileList, pattern):
'''Sucht in mehreren Dateien nach einem Knoten und liefert die Ergebnisse als neues XML zurück'''
from xml.etree import ElementTree as ET
from datetime import datetime as DT
nodename = input('Bitte Name des gesuchten Knoten eingeben:')
newroot = ET.Element('results')
newroot.attrib = {'date': DT.now().date().isoformat()}
d = input('Mit dem Dictonary fortfahren? y/n: ')
if d.lower() != 'y':
print('Bitte neues Pattern angeben')
pattern = subPattern()
for file in fileList:
docTag = file.split('/')[-1]
res = re.compile('[\)\(\+]')
docTag = re.sub(res, '-', docTag)
docTag = docTag.replace(' ', '')
if docTag.startswith(tuple(str(1234567890))):
docTag = '_'+docTag
doc = ET.SubElement(newroot, docTag)
doc.attrib = {"loc", file}
print(str(fileList.index(file)) + ': ' + docTag)
if nodename in file:
doc.attrib = {'error':'tagInFileName'}
else:
try:
with open(file, mode="r") as fin:
fText = fin.read()
fText = cleanUp(fText, pattern) #Austausch div. Zeichen, die beim Einlesen des Baums Probleme verursacht hatten
try:
tree = ET.ElementTree(ET.fromstring(fText))
root = tree.getroot()
for child in root.findall('.//'+nodename):
ancestorNode = ET.SubElement(doc, root.findall('.//'+nodename+'/../..')[0].tag)
ancestorNode.attrib = root.findall('.//'+nodename+'/../..')[0].attrib
ancestorNode.text = root.findall('.//'+nodename+'/../..')[0].text
ancestorNode.tail = root.findall('.//'+nodename+'/../..')[0].tail
for parent in root.findall('.//'+nodename+'/..'):
parentNode = ancestorNode.append(parent)
except:
doc.attrib = {'error':'notRead'}
except:
doc.attrib = {'error':'notOpened'}
return(ET.ElementTree(newroot))