繁体   English   中英

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

[英]toprettyxml() : write() argument must be str, not 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。

文档强调我的:

不带参数,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"))

您可以通过以下方式解决问题:

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

我不建议使用 'wb' 模式,因为这不考虑行尾转换。 相反,我使用以下方法来做到这一点:

dom = minidom.parseString(utf_8_xml_text)

out_byte = dom.toprettyxml(encoding="utf-8")
out_text = out_byte.decode("utf-8")

with open(filename, "w", encoding="utf-8") as f:
    f.write(out_text)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM