使用Python lxml连续写入输出文件

时间:2014-02-15 12:53:48

标签: python lxml

我正在将大量数据从数据库写入XML文件。我正在使用Python及其lxml库来创建文件。 我注意到它在内存中生成整个XML文件,然后在最后将它输出到文件,有没有办法为每X个数据库对象转储xml文件?

import lxml.etree as etree
import os

root = etree.Element('root')
db_obj1 = etree.SubElement(root, 'item')
db_obj2 = etree.SubElement(root, 'item')
db_obj3 = etree.SubElement(root, 'item')
et = etree.ElementTree(root)
et.write(sys.stdout)

我已尝试使用ElemenTree()。​​write(),但在http://lxml.de/api/lxml.etree._ElementTree-class.html的文档中找不到任何关于如何完成此操作的设置或最佳做法。

希望减少总内存占用量。

1 个答案:

答案 0 :(得分:3)

来自the lxml docs

  

拥有一个或多个嵌套的element()块是一种常见的模式,   然后在循环中构建内存中的XML子树(使用ElementTree   API,构建器API,XSLT或其他)将它们写入   XML文件一个接一个。这样,他们就可以从中删除   在他们建造之后的记忆,可以大大减少   应用程序的MEMORY FOOTPRINT,同时保留整个XML   一代轻松,安全,正确。 [强调我的]。

filename = "/tmp/somefile.xml"
with ET.xmlfile(filename, encoding='utf-8') as xf:
    xf.write_declaration(standalone=True)
    xf.write_doctype('<!DOCTYPE root SYSTEM "some.dtd">')
    with xf.element('root'):
        for value in '123':
            # construct a really complex XML tree
            el = ET.Element('item', attr=value)
            xf.write(el)
            # no longer needed, discard it right away!
            el = None

写入

<?xml version='1.0' encoding='utf-8' standalone='yes'?>
<!DOCTYPE root SYSTEM "some.dtd">
<root><item attr="1"/><item attr="2"/><item attr="3"/></root>

到文件。