Подтвердить что ты не робот

UnicodeDecodeError: кодек 'ascii' не может декодировать байт 0xc2

Я создаю XML файл в Python и там поле на моем XML, которое я помещаю в содержимое текстового файла. Я делаю это с помощью

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")

И затем я получаю UnicodeDecodeError. Я уже пробовал поставить специальный комментарий # -*- coding: utf-8 -*- поверх моего script, но все еще получил ошибку. Кроме того, я уже пытался выполнить кодировку моей переменной data.encode('utf-8'), но все же получил ошибку. Я знаю, что эта проблема очень распространена, но все решения, которые я получил от других вопросов, не работали для меня.

UPDATE

Traceback: использование только специального комментария в первой строке script

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)

Отслеживание: использование .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)

Я использовал .decode('utf-8'), и сообщение об ошибке не появилось и оно успешно создало мой XML файл. Но проблема в том, что XML не доступен для просмотра в моем браузере.

4b9b3361

Ответ 1

Вам необходимо декодировать данные из входной строки в unicode перед ее использованием, чтобы избежать проблем с кодировкой.

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

Ответ 2

Я столкнулся с подобной ошибкой в ​​pywikipediabot. Метод .decode является шагом в правильном направлении, но для меня он не работает без добавления 'ignore':

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

Ответ 3

Python 2

Ошибка вызвана тем, что ElementTree не ожидал найти строки, отличные от ASCII, которые устанавливают XML при попытке записать его. Вместо этого вы должны использовать строки Unicode для не-ASCII. Строки Unicode могут быть сделаны либо с использованием префикса u для строк, т.е. u'€', либо путем декодирования строки с помощью mystr.decode('utf-8') с использованием соответствующей кодировки.

Лучшей практикой является декодирование всех текстовых данных по мере их чтения, а не декодирование средней программы. Модуль io предоставляет метод open(), который декодирует текстовые данные в строки Unicode по мере их чтения.

ElementTree будет намного счастливее с Unicodes и будет правильно кодировать его правильно при использовании метода ET.write().

Кроме того, для обеспечения лучшей совместимости и удобочитаемости убедитесь, что ET кодирует UTF-8 во время write() и добавляет соответствующий заголовок.

Предполагая, что ваш входной файл закодирован в кодировке UTF-8 (0xC2 является общим старшим байтом UTF-8), все вместе, и используя оператор with, ваш код должен выглядеть так:

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)

Вывод:

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

Ответ 4

#!/usr/bin/python

# encoding=utf8

Попробуйте это для запуска файла python