2017-02-27 24 views
2

Es ist ein Problem beim Generieren einer .SVG Datei mit Python3 und ElementTree.ElementTree TypeError "write() Argument muss str sein, nicht Bytes" in Python3

from xml.etree import ElementTree as et 
    doc = et.Element('svg', width='480', height='360', version='1.1', xmlns='http://www.w3.org/2000/svg') 

    #Doing things with et and doc 

    f = open('sample.svg', 'w') 
    f.write('<?xml version=\"1.0\" standalone=\"no\"?>\n') 
    f.write('<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n') 
    f.write('\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n') 
    f.write(et.tostring(doc)) 
    f.close() 

Die Funktion et.tostring (doc) erzeugt die Typeerror "write() Argument str werden muß, nicht bytes". Ich verstehe dieses Verhalten nicht, "et" sollte das ElementTree-Element in eine Zeichenfolge konvertieren? Es funktioniert in Python2, aber nicht in Python3. Was habe ich falsch gemacht?

+0

Haben Sie die Dokumentation überprüft? Sehen Sie [diese Seite] (https://docs.python.org/3/library/xml.etree.elementtree.html) und suchen Sie nach "tostring". Hilft das? –

+0

nicht wirklich, es sollte bereits in utf-8 bytestring decodiert werden, aber python3 scheint ein Problem damit zu haben –

Antwort

6

Wie sich herausstellt, tostring, trotz seines Namens, wirklich tut ein Objekt zurückgeben, deren Typ bytes.

Fremde Dinge sind passiert. Wie auch immer, hier ist der Beweis:

>>> from xml.etree.ElementTree import ElementTree, tostring 
>>> import xml.etree.ElementTree as ET 
>>> element = ET.fromstring("<a></a>") 
>>> type(tostring(element)) 
<class 'bytes'> 

Dumm, nicht wahr?

Zum Glück können Sie dies tun:

>>> type(tostring(element, encoding="unicode")) 
<class 'str'> 

Ja, wir alle dachten, die Lächerlichkeit des Bytes und die alte, vierzig-plus-jährige-and-veralteter Verschlüsselungs ascii war tot bezeichnet.

Und fange mich nicht an die Tatsache, dass sie "unicode" eine Codierung anrufen !!!!!!!!!!!

+0

Es war lustig zu testen. Ich konnte es nicht glauben, als ich das Ergebnis von "type (tostring (element))" sah. Und dann sehen Sie das Ergebnis wegen einer Änderung an einem Parameterwert ändern. Beeindruckend. Das war wirklich komisch. Gute Frage. –

2

Versuchen:

f.write(et.tostring(doc).decode(encoding)) 

Beispiel:

f.write(et.tostring(doc).decode("utf-8")) 
2

Geben Sie die Codierung der Zeichenfolge beim Schreiben der XML-Datei an.

Wie decode(UTF-8) mit write(). Beispiel: file.write(etree.tostring(doc).decode(UTF-8))

Verwandte Themen