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

Nik*_*as9 2 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)
Run Code Online (Sandbox Code Playgroud)

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

寻求减少总内存占用。

unu*_*tbu 5

来自lxml 文档

一种常见的模式是拥有一个或多个嵌套的 element() 块,然后在循环中构建内存中 XML 子树(使用 ElementTree API、构建器 API、XSLT 或其他方式)以将它们写入 XML 文件中一个接一个地。这样,它们可以在构建后立即从内存中删除,这可以大大减少应用程序的内存占用,同时保持整个 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
Run Code Online (Sandbox Code Playgroud)

<?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>
Run Code Online (Sandbox Code Playgroud)

到文件。