41

我在 Python 中创建 XML 文件,并且我的 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 -*-放在我的脚本之上,但仍然出现错误。此外,我已经尝试强制对我的变量进行编码,data.encode('utf-8')但仍然出现错误。我知道这个问题很常见,但我从其他问题中得到的所有解决方案都对我不起作用。

更新

Traceback:仅使用脚本第一行的特殊注释

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 在我的浏览器上不可见。

4

4 回答 4

69

在使用它之前,您需要将输入字符串中的数据解码为 un​​icode,以避免编码问题。

field.text = data.decode("utf8")
于 2013-05-12T15:33:17.187 回答
12

我在 pywikipediabot 中遇到了类似的错误。该.decode方法是朝着正确方向迈出的一步,但对我来说,如果不添加它就行不通'ignore'

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

忽略编码错误会导致数据丢失或产生不正确的输出。但是,如果您只是想完成它并且细节不是很重要,这可能是加快行动的好方法。

于 2013-12-25T03:32:48.470 回答
10

蟒蛇2

该错误是因为 ElementTree 在尝试写出 XML 时没有期望找到设置 XML 的非 ASCII 字符串。您应该对非 ASCII 使用 Unicode 字符串。Unicode 字符串可以通过u在字符串上使用前缀来生成,即,u'€'或者通过mystr.decode('utf-8')使用适当的编码对字符串进行解码。

最佳实践是在读取所有文本数据时对其进行解码,而不是在程序中间进行解码。该io模块提供了open()一种在读取文本数据时将其解码为 Unicode 字符串的方法。

ET.write()ElementTree 会更喜欢 Unicode,并且在使用该方法时会正确地对其进行编码。

此外,为了获得最佳兼容性和可读性,请确保 ET 在期间编码为 UTF-8write()并添加相关标头。

假设您的输入文件是 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€&lt;/field></doc></add>
于 2016-05-07T12:03:29.313 回答
1

#!/usr/bin/python

# encoding=utf8

试试这个到 python 文件的开始

于 2016-11-21T09:24:37.060 回答