Python写入XML报charmap编码错误,加encoding后报需str非bytes如何解决?
问题原因及解决方案
核心问题
你混淆了Python内置open()函数的参数和xml.etree.ElementTree.ElementTree.write()方法的参数逻辑,同时初始代码存在语法错误。
错误原因拆解
- 第一个
charmap编码错误:Windows系统默认文本编码为GBK/CP936,无法编码ᵒ这类特殊Unicode字符,加上初始代码语法错误,encoding='unicode'参数没有正确传入write方法,写入时自动使用系统默认编码导致报错。 - 第二个
write() argument must be str, not bytes错误:你错误传入了打开模式参数'w',当你给write方法第一个参数传文件路径字符串时,方法内部会自动处理文件打开逻辑,不需要额外传模式。多余的'w'会被错误识别为encoding参数值,或者导致方法以文本模式打开文件,但你指定encoding='utf-8'时write方法会输出字节流,字节流写入文本模式的文件对象就会触发类型不匹配错误。 - 额外语法问题:你贴出的两次代码都存在括号不匹配的问题,Python对语法格式要求严格,写代码时要注意括号、缩进的正确性。
正确写法
推荐最简单的写法,直接传入路径和编码参数即可,不需要多余的模式参数:
import xml.etree.ElementTree as ET tree = ET.ElementTree(root) # xml_declaration=True会在XML头部声明编码为utf-8,避免后续解析乱码 tree.write("Cool_Output.xml", encoding="utf-8", xml_declaration=True)
如果你习惯手动控制文件打开流程(和你之前用的JS/C#写法逻辑类似),可以用上下文管理器手动打开文件:
import xml.etree.ElementTree as ET tree = ET.ElementTree(root) # 文本模式打开,指定编码为utf-8 with open("Cool_Output.xml", 'w', encoding="utf-8") as f: tree.write(f, encoding='unicode')
或者二进制模式写入:
import xml.etree.ElementTree as ET tree = ET.ElementTree(root) # 二进制模式打开 with open("Cool_Output.xml", 'wb') as f: tree.write(f, encoding="utf-8")
内容的提问来源于stack exchange,提问作者Mi-krater
相关产品推荐
相关产品推荐

