toprettyxml():write()参数必须是str,而不是bytes

时间:2018-05-06 19:20:40

标签: python xml utf-8

我的程序将一些XML数据从XML字符串中以一种漂亮的格式保存到文件中。这就是诀窍:

$data

但是,我注意到我的XML标头缺少编码参数。

from xml.dom.minidom import parseString
dom = parseString(strXML)
with open(file_name + ".xml", "w", encoding="utf8") as outfile:
    outfile.write(dom.toprettyxml())

由于我的数据容易包含许多Unicode字符,因此我必须确保在XML编码字段中也指定了UTF-8。

现在,看一下minidom文档,我读到“可以使用额外的关键字参数编码来指定XML头的编码字段”。所以我试试这个:

<?xml version="1.0" ?>

但后来我得到了:

from xml.dom.minidom import parseString
dom = parseString(strXML)
with open(file_name + ".xml", "w", encoding="utf8") as outfile:
    outfile.write(dom.toprettyxml(encoding="UTF-8"))

为什么第一段代码不会产生错误?我做错了什么?

谢谢!

R上。

2 个答案:

答案 0 :(得分:0)

您可以按照以下步骤解决问题:

with open(targetName, 'wb') as f:
    f.write(dom.toprettyxml(indent='\t', encoding='utf-8'))

答案 1 :(得分:-1)

来自documentation强调我的

  

如果没有参数,则XML标头不指定编码,如果默认编码不能表示文档中的所有字符,则结果为 Unicode字符串。使用UTF-8以外的编码对此字符串进行编码可能不正确,因为UTF-8是XML的默认编码。

     

使用显式编码参数,结果是指定编码中的字节字符串。建议始终指定此参数。为了避免在无法表示的文本数据的情况下出现UnicodeError异常,编码参数应指定为“utf-8”。

因此write方法输出不同的对象类型,无论是否设置了编码(如果你问我,这会让人感到困惑)

所以你可以通过删除编码来修复:

with open(file_name + ".xml", "w", encoding="utf8") as outfile:
    outfile.write(dom.toprettyxml())

或以二进制模式打开文件,然后接受要写入的字节字符串

with open(file_name + ".xml", "wb") as outfile:
    outfile.write(dom.toprettyxml(encoding="utf8"))