首页 > 解决方案 > toprettyxml() : write() 参数必须是 str,而不是 bytes

问题描述

我的程序将一些 XML 数据从 XML 字符串中以一种漂亮的格式保存到一个文件中。这可以解决问题:

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

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

<?xml version="1.0" ?>

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

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

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"))

但后来我得到:

TypeError: write() argument must be str, not bytes

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

谢谢!

R。

标签: pythonxmlutf-8

解决方案


文档强调我的:

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

使用显式编码参数,结果是指定编码的字节字符串。建议始终指定此参数。为避免在不可表示的文本数据的情况下出现 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"))

推荐阅读