it-swarm.com.de

UnicodeDecodeError: Der 'ASCII'-Codec kann das Byte 0xc2 nicht decodieren

Ich erstelle eine XML-Datei in Python und es gibt ein Feld in meinem XML, in das ich den Inhalt einer Textdatei einfüge

f = open ('myText.txt',"r")
data = f.read()
f.close()

root = ET.Element("add")
doc = ET.SubElement(root, "doc")

field = ET.SubElement(doc, "field")
field.set("name", "text")
field.text = data

tree = ET.ElementTree(root)
tree.write("output.xml")

Und dann bekomme ich den UnicodeDecodeError. Ich habe bereits versucht, den speziellen Kommentar # -*- coding: utf-8 -*- In mein Skript einzufügen, habe aber trotzdem den Fehler erhalten. Außerdem habe ich bereits versucht, die Codierung meiner Variablen data.encode('utf-8') zu erzwingen, habe aber trotzdem den Fehler erhalten. Ich weiß, dass dieses Problem sehr häufig auftritt, aber alle Lösungen, die ich aus anderen Fragen erhalten habe, haben bei mir nicht funktioniert.

UPDATE

Traceback: Verwenden Sie nur den speziellen Kommentar in der ersten Zeile des Skripts

Traceback (most recent call last):
  File "D:\Python\lse\createxml.py", line 151, in <module>
    tree.write("D:\\python\\lse\\xmls\\" + items[ctr][0] + ".xml")
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 820, in write
    serialize(write, self._root, encoding, qnames, namespaces)
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 939, in _serialize_xml
    _serialize_xml(write, e, encoding, qnames, None)
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 939, in _serialize_xml
    _serialize_xml(write, e, encoding, qnames, None)
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 937, in _serialize_xml
    write(_escape_cdata(text, encoding))
  File "C:\Python27\lib\xml\etree\ElementTree.py", line 1073, in _escape_cdata
    return text.encode(encoding, "xmlcharrefreplace")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 243: ordina
l not in range(128)

Traceback: Mit .encode('utf-8')

Traceback (most recent call last):
  File "D:\Python\lse\createxml.py", line 148, in <module>
    field.text = data.encode('utf-8')
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 227: ordina
l not in range(128)

Ich habe .decode('utf-8') verwendet und die Fehlermeldung wurde nicht angezeigt und meine XML-Datei wurde erfolgreich erstellt. Das Problem ist jedoch, dass das XML in meinem Browser nicht angezeigt werden kann.

35
kagat-kagat

Sie müssen Daten von der Eingabezeichenfolge in Unicode dekodieren, bevor Sie sie verwenden, um Kodierungsprobleme zu vermeiden.

field.text = data.decode("utf8")
64
uhbif19

Bei pywikipediabot ist mir ein ähnlicher Fehler unterlaufen. Das .decode Methode ist ein Schritt in die richtige Richtung, aber für mich hat es nicht funktioniert, ohne 'ignore':

fix_encoding = lambda s: s.decode('utf8', 'ignore')
12
guaka

Python 2

Der Fehler wird dadurch verursacht, dass ElementTree nicht erwartet hat, Nicht-ASCII-Zeichenfolgen zu finden, die das XML beim Versuch, es zu schreiben, festgelegt haben. Sie sollten stattdessen Unicode-Zeichenfolgen für Nicht-ASCII-Zeichen verwenden. Unicode-Zeichenfolgen können entweder mit dem Präfix u für Zeichenfolgen erstellt werden, d. H. u'€', Oder durch Dekodieren einer Zeichenfolge mit mystr.decode('utf-8') unter Verwendung der entsprechenden Kodierung.

Die beste Vorgehensweise ist, alle Textdaten beim Lesen zu dekodieren, anstatt sie während des Programmierens zu dekodieren. Das io -Modul bietet eine open() -Methode, mit der Textdaten beim Lesen in Unicode-Zeichenfolgen decodiert werden.

ElementTree ist mit Unicodes viel zufriedener und codiert es ordnungsgemäß, wenn die ET.write() -Methode verwendet wird.

Stellen Sie aus Gründen der Kompatibilität und Lesbarkeit außerdem sicher, dass ET während write() nach UTF-8 codiert und den entsprechenden Header hinzufügt.

Vorausgesetzt, Ihre Eingabedatei ist UTF-8-codiert (0xC2 Ist das übliche UTF-8-Hauptbyte). Fügen Sie alles zusammen und verwenden Sie die Anweisung with. Ihr Code sollte folgendermaßen aussehen:

with io.open('myText.txt', "r", encoding='utf-8') as f:
    data = f.read()

root = ET.Element("add")
doc = ET.SubElement(root, "doc")

field = ET.SubElement(doc, "field")
field.set("name", "text")
field.text = data

tree = ET.ElementTree(root)
tree.write("output.xml", encoding='utf-8', xml_declaration=True)

Ausgabe:

<?xml version='1.0' encoding='utf-8'?>
<add><doc><field name="text">data€</field></doc></add>
7

#!/usr/bin/python

# encoding=utf8

Versuchen Sie dies, um python file zu starten

2