You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

toprettyxml()报错:write()参数需为str而非bytes,XML头缺失UTF-8编码

我来帮你搞定这两个问题——XML声明缺UTF-8编码参数,还有那个write() argument must be str, not bytes的报错,这俩其实是关联的,给你两种靠谱的解决办法:

方法一:二进制写入(推荐,最省心)

直接给toprettyxml()指定编码参数,然后用二进制模式写入文件:

from xml.dom.minidom import parseString

dom = parseString(strXML)
# 指定encoding='utf-8'后,toprettyxml会返回字节流,同时自动补全XML头的encoding参数
xml_content = dom.toprettyxml(encoding='utf-8')
with open(f"{file_name}.xml", "wb") as outfile:
    outfile.write(xml_content)

这么做的好处:

  • XML声明会自动变成<?xml version="1.0" encoding="UTF-8" ?>,完美符合你的需求
  • 返回的字节流直接用wb模式写入,不用纠结编码转换,Unicode字符肯定能正确保存
  • 避开了文本模式和二进制模式的类型冲突问题

方法二:手动修正XML声明(文本模式写入)

如果你习惯用文本模式操作,可以先拿到默认的格式化字符串,再替换掉默认的XML头:

from xml.dom.minidom import parseString

dom = parseString(strXML)
pretty_xml = dom.toprettyxml()
# 把默认的无编码声明替换成带UTF-8的版本
pretty_xml = pretty_xml.replace('<?xml version="1.0" ?>', '<?xml version="1.0" encoding="UTF-8" ?>')
with open(f"{file_name}.xml", "w", encoding="utf8") as outfile:
    outfile.write(pretty_xml)

为啥会出这俩问题?

  1. XML头缺encoding:toprettyxml()默认不会自动添加编码参数,只有显式传入encoding参数,或者手动修改声明才会有
  2. 类型报错:当你给toprettyxml()传encoding参数时,它会返回bytes类型的数据,但你用w(文本模式)打开文件,文本模式只接受str,所以就炸了。要么用wb写bytes,要么不用encoding参数、手动改XML头后写str,二选一就行。

内容的提问来源于stack exchange,提问作者mrgou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:41:49