代码之家  ›  专栏  ›  技术社区  ›  mrgou

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

  •  2
  • mrgou  · 技术社区  · 6 年前

    我的程序将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

    3 回复  |  直到 6 年前
        1
  •  3
  •   Community Dai    4 年前

    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"))
    
        2
  •  1
  •   Tiger Wang    6 年前

    您可以按以下方式解决此问题:

    with open(targetName, 'wb') as f:
        f.write(dom.toprettyxml(indent='\t', encoding='utf-8'))
    
        3
  •  0
  •   guan boshen    3 年前

    我不建议使用 wb 输出模式,因为它不考虑行尾转换(例如,转换 \n \r\n 在Windows上使用时 Text 模式)。相反,我使用以下方法来执行此操作:

    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)
    

    对于高于3.9的python版本,使用内置 indent 功能。