Create zipfile: TypeError: object of type 'ElementTree' has no len()

Create zipfile: TypeError: object of type 'ElementTree' has no len()

我正在将 xml 数据写入 zip。

from xml.etree.ElementTree import Element, SubElement, ElementTree
from zipfile import ZipFile

def create_tree():
    root = Element("root")
    doc = SubElement(root, "doc")
    SubElement(doc, "field", name="blah").text = "text"

    return ElementTree(root)


def test():
    """
    Create zip
    """
    with ZipFile("xml.zip", 'w') as ziparc:
        element_tree = create_tree()
        ziparc.writestr("file.xml", element_tree)


if __name__ == "__main__":
    test()

一个错误:

File "main_test2_2.py", line 168, in test
    ziparc.writestr('file.xml', element_tree)
  File "/usr/lib/python2.7/zipfile.py", line 1127, in writestr
    zinfo.file_size = len(bytes)            # Uncompressed size
TypeError: object of type 'ElementTree' has no len()

请告诉我,如何将 xml 数据写入存档?

将元素写入假文件(缓冲区)

from xml.etree.ElementTree import Element, SubElement, ElementTree
from zipfile import ZipFile
from io import BytesIO

def create_tree():
    root = Element("root")
    doc = SubElement(root, "doc")
    SubElement(doc, "field", name="blah").text = "text"

    return ElementTree(root)


def test():
    """
    Create zip
    """
    with ZipFile("xml.zip", 'w') as ziparc:
        element_tree = create_tree()
        outbuf = BytesIO()
        element_tree.write(outbuf)
        ziparc.writestr("file.xml", outbuf.getvalue())


if __name__ == "__main__":
    test()

编辑:另一位用户尝试建议 tostring 方法,但它不完整且无法正常工作,可能是因为首先参数必须是 Element 而不是 ElementTree,其次由于导入(ElementTree 是一个包和一个子class,所以有歧义)。

但是,我修改了完整的源代码,它也可以工作,我认为这是一个更好的解决方案(为删除他的 post 的其他用户干杯!)

from xml.etree.ElementTree import Element, SubElement
from zipfile import ZipFile
import xml.etree.ElementTree

def create_tree():
    root = Element("root")
    doc = SubElement(root, "doc")
    SubElement(doc, "field", name="blah").text = "text"

    return root


def test():
    """
    Create zip
    """
    with ZipFile("xml.zip", 'w') as ziparc:
        element_tree = create_tree()

        ziparc.writestr("file.xml", xml.etree.ElementTree.tostring(element_tree))


if __name__ == "__main__":
    test()