我在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'))
我该怎么办呢?
答案 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')
为您打开文件。