Python:如何在写入文件时保留Ä,Ö,Ü

时间:2012-07-18 08:40:52

标签: python encoding utf-8

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

的东西
ü

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

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

我该怎么办呢?

4 个答案:

答案 0 :(得分:2)

我认为这应该有效:

import codecs

with codecs.open("file.xml", 'w', "utf-8") as fout:
    # do stuff with filepointer

答案 1 :(得分:2)

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

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

否则open call会以文本模式打开文件并改为使用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 character entities(例如ü),其他代码可以执行此操作,但您没有与我们分享。

在理解编码和unicode方面,我发现Joel Spolsky's article on Unicode非常宝贵。

答案 2 :(得分:2)

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

tree.write('file', encoding='utf-8')

答案 3 :(得分:1)

Python 2的xml.etree.ElementTree及其函数parse()的一些解释。该函数将source作为第一个参数。或者它可以是一个打开的文件对象,也可以是一个文件名。该函数创建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。如果是这种情况,您也可以使用带有UTF-8的 codecs.open(...)进行编写。您可以将打开的输出文件对象传递给上面提到的tree.write(f),让 tree.write(filename, encoding='utf-8') 为您打开文件。