0

我在 Python 中打开 2 个文件,更改和替换其中的一些内容,并将新输出写入第三个文件。我的 2 个输入文件是 XML,以“UTF-8 without BOM”编码,其中包含德语 Ä、Ö、Ü 和 ß。当我在 Notepad++ 中打开输出 XML 文件时,未指定编码(即“编码”选项卡中未检查编码)。我的 Ä,Ö,Ü 和 ß 被转换成类似的东西

ü

当我在 Python 中创建输出时,我使用

with open('file', 'w') as fout:
  fout.write(etree.tostring(tree.getroot()).decode('utf-8'))

我该怎么做呢?

4

4 回答 4

2

要将ElementTree对象写入使用字符编码tree命名的文件:'file''utf-8'

tree.write('file', encoding='utf-8')
于 2012-07-18T09:28:50.607 回答
2

我认为这应该有效:

import codecs

with codecs.open("file.xml", 'w', "utf-8") as fout:
    # do stuff with filepointer
于 2012-07-18T08:44:25.873 回答
2

写入原始字节串时,您希望以二进制模式打开文件:

with open('file', 'wb') as fout:
    fout.write(xyz)

否则,该open调用以文本模式打开文件并需要 unicode 字符串,并将为您编码它们。

解码,就是解释编码(如 utf-8),输出是 unicode 文本。如果您确实想先解码,请在以文本模式打开文件时指定编码:

with open(file, 'w', encoding='utf-8') as fout:
    fout.write(xyz.decode('utf-8'))

如果您不指定编码,Python 将使用默认值,这通常是一件坏事。请注意,由于您已经开始使用UTF-8 编码的字节字符串,因此这实际上是无用的。

请注意,python 文件操作永远不会将现有的 unicode 点转换为XML 字符实体(例如ü),您拥有的其他代码可以做到这一点,但您没有与我们分享。

在理解编码和 unicode 时,我发现Joel Spolsky 关于 Unicode 的文章非常宝贵。

于 2012-07-18T08:45:06.220 回答
1

xml.etree.ElementTreePython 2 及其函数的一些解释parse()。该函数将源作为第一个参数。或者它可以是一个打开的文件对象,也可以是一个文件名。该函数创建ElementTree实例,然后将参数传递给tree.parse(...)如下所示:

def parse(self, source, parser=None):
    if not hasattr(source, "read"):
        source = open(source, "rb")
    if not parser:
        parser = XMLParser(target=TreeBuilder())
    while 1:
        data = source.read(65536)
        if not data:
            break
        parser.feed(data)
    self._root = parser.close()
    return self._root

您可以从第三行猜测,如果传递了文件名,则文件将以二进制模式打开。这样,如果文件内容采用 UTF-8 格式,则您正在处理具有 UTF-8 编码的二进制内容的元素。如果是这种情况,您还应该以二进制模式打开输出文件

另一种可能性是codecs.open(filename, encoding='utf-8')用于打开输入文件,并将打开的文件对象传递给xml.etree.ElementTree.parse(...). 这样,ElementTree实例将使用 Unicode 字符串,并且您应该在写回内容时将结果编码为 UTF-8。如果是这种情况,您也可以使用codecs.open(...)UTF-8 来编写. 您可以将打开的输出文件对象传递给提到的tree.write(f)或者tree.write(filename, encoding='utf-8')文件为您打开。

于 2012-07-18T10:42:31.737 回答