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()
我正在将 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()