Какой самый простой способ вывода XML из Python без интенсивного использования памяти?

По сути, что-то похожее на System.Xml.XmlWriter - потоковый модуль записи XML, который не требует больших затрат памяти. Это исключает xml.dom и xml.dom.minidom. Предложения?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
14
0
2 567
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я думаю, у меня есть твой яд:

http://sourceforge.net/projects/xmlite

Ваше здоровье

Ответ принят как подходящий

xml.etree.cElementTree, включенный в дистрибутив CPython по умолчанию, начиная с версии 2.5. Молниеносно как для чтения, так и для записи XML.

Тем не менее, cElementTree не является потоковым писателем и, таким образом, будет использовать память линейно по размеру создаваемого XML-дерева, хотя и намного меньше, чем xml.dom.

Torsten Marek 20.09.2008 23:09

У меня всегда были хорошие результаты с lxml. Его сложно установить, поскольку это в основном оболочка вокруг libxml2, но объекты дерева lxml.etree имеют метод .write(), который принимает файловый объект для потоковой передачи.

from lxml.etree import XML

tree = XML('<root><a><b/></a></root>')
tree.write(your_file_object)

Несколько лет назад я использовал MarkupWriter от 4 люкса

General-purpose utility class for generating XML (may eventually be
expanded to produce more output types)

Sample usage:

from Ft.Xml import MarkupWriter
writer = MarkupWriter(indent=u"yes")
writer.startDocument()
writer.startElement(u'xsa')
writer.startElement(u'vendor')
#Element with simple text (#PCDATA) content
writer.simpleElement(u'name', content=u'Centigrade systems')
#Note writer.text(content) still works
writer.simpleElement(u'email', content=u"[email protected]")
writer.endElement(u'vendor')
#Element with an attribute
writer.startElement(u'product', attributes = {u'id': u"100\u00B0"})
#Note writer.attribute(name, value, namespace=None) still works
writer.simpleElement(u'name', content=u"100\u00B0 Server")
#XML fragment
writer.xmlFragment('<version>1.0</version><last-release>20030401</last-release>')
#Empty element
writer.simpleElement(u'changes')
writer.endElement(u'product')
writer.endElement(u'xsa')
writer.endDocument()

Note on the difference between 4Suite writers and printers
Writer  - module that exposes a broad public API for building output
          bit by bit
Printer - module that simply takes a DOM and creates output from it
          as a whole, within one API invokation

В последнее время я много слышу о том, насколько хорош lxml, но у меня нет личного опыта, и мне было весело работать с гнозис.

Боюсь, что 4suite больше не в сети. Что касается lxml, он великолепен, но не имеет средства стриминга AFAIK.

rds 06.01.2012 18:04

Я думаю, вы найдете XMLGenerator из xml.sax.saxutils - это самое близкое к тому, что вам нужно.

import time
from xml.sax.saxutils import XMLGenerator
from xml.sax.xmlreader import AttributesNSImpl

LOG_LEVELS = ['DEBUG', 'WARNING', 'ERROR']


class xml_logger:
    def __init__(self, output, encoding):
        """
        Set up a logger object, which takes SAX events and outputs
        an XML log file
        """
        logger = XMLGenerator(output, encoding)
        logger.startDocument()
        attrs = AttributesNSImpl({}, {})
        logger.startElementNS((None, u'log'), u'log', attrs)
        self._logger = logger
        self._output = output
        self._encoding = encoding
        return

    def write_entry(self, level, msg):
        """
        Write a log entry to the logger
        level - the level of the entry
        msg   - the text of the entry.  Must be a Unicode object
        """
        #Note: in a real application, I would use ISO 8601 for the date
        #asctime used here for simplicity
        now = time.asctime(time.localtime())
        attr_vals = {
            (None, u'date'): now,
            (None, u'level'): LOG_LEVELS[level],
            }
        attr_qnames = {
            (None, u'date'): u'date',
            (None, u'level'): u'level',
            }
        attrs = AttributesNSImpl(attr_vals, attr_qnames)
        self._logger.startElementNS((None, u'entry'), u'entry', attrs)
        self._logger.characters(msg)
        self._logger.endElementNS((None, u'entry'), u'entry')
        return

    def close(self):
        """
        Clean up the logger object
        """
        self._logger.endElementNS((None, u'log'), u'log')
        self._logger.endDocument()
        return

if __name__ == "__main__":
    #Test it out
    import sys
    xl = xml_logger(sys.stdout, 'utf-8')
    xl.write_entry(2, u"Vanilla log entry")
    xl.close()   

Вы, вероятно, захотите посмотреть оставшуюся часть статьи, которую я получил из http://www.xml.com/pub/a/2003/03/12/py-xml.html.

+1: это единственный потоковый ответ, встроенный в python.

Jason S 31.01.2013 00:27

Второе голосование за ElementTree (cElementTree - это реализация C, которая немного быстрее, например cPickle vs pickle). Здесь есть небольшой пример кода, на который вы можете посмотреть, чтобы получить представление о том, как это работает: http://effbot.org/zone/element-index.htm (это Фредрик Лунд, который первым написал модуль. Он настолько хорош, что его встроили в стандартную библиотеку с помощью 2.5 :-))

Другие вопросы по теме