Разбор больших псевдо-XML-файлов в Python - PullRequest
5 голосов
/ 02 октября 2009

Я пытаюсь проанализировать * большой файл (> 5 ГБ) структурированных данных разметки. Формат данных по сути XML, но нет явного корневого элемента. Какой самый эффективный способ сделать это?

Проблема с синтаксическими анализаторами SAX заключается в том, что им требуется корневой элемент, поэтому либо я должен добавить псевдоэлемент в поток данных (есть ли эквивалент Java SequenceInputStream в Python?), Либо перейти на синтаксический анализатор событий, не соответствующий SAX (есть ли преемник sgmllib?)

Структура данных довольно проста. В основном список элементов:

<Document>
  <docid>1</docid>
  <text>foo</text>
</Document>
<Document>
  <docid>2</docid>
  <text>bar</text>
</Document>

* на самом деле, чтобы повторить

Ответы [ 4 ]

11 голосов
/ 02 октября 2009

http://docs.python.org/library/xml.sax.html

Обратите внимание, что вы можете передать объект stream в xml.sax.parse. Это означает, что вы, вероятно, можете передать любой объект с файловыми методами (например, read) в вызов parse ... Создайте свой собственный объект, который сначала поместит начальный тэг вашего виртуального корня, а затем содержимое файла. затем виртуальный корневой конечный тег. Я предполагаю, что вам нужно реализовать только метод read ... но это может зависеть от используемого вами синтаксического анализатора.

Пример, который работает для меня:

import xml.sax
import xml.sax.handler

class PseudoStream(object):
    def read_iterator(self):
        yield '<foo>'
        yield '<bar>'
        for line in open('test.xml'):
            yield line
        yield '</bar>'
        yield '</foo>'

    def __init__(self):
        self.ri = self.read_iterator()

    def read(self, *foo):
        try:
            return self.ri.next()
        except StopIteration:
            return ''

class SAXHandler(xml.sax.handler.ContentHandler):
    def startElement(self, name, attrs):
        print name, attrs

d = xml.sax.parse(PseudoStream(), SAXHandler())
1 голос
/ 02 октября 2009

Добавить корневой элемент и использовать SAX, STax или VTD-XML ..

1 голос
/ 02 октября 2009

Быстрый и грязный ответ - добавить корневой элемент (как String), чтобы он был действительным XML.

Привет.

0 голосов
/ 02 октября 2009

xml.parsers.expat - Быстрый анализ XML с использованием Expat Модуль xml.parsers.expat представляет собой интерфейс Python для не проверяющего парсер XML Expat. Модуль предоставляет единственный тип расширения, xmlparser, который представляет текущее состояние анализатора XML. После создания объекта xmlparser различные атрибуты объекта могут быть установлены в функции-обработчики. Когда XML-документ затем подается в анализатор, функции-обработчики вызываются для символьных данных и разметки в XML-документе.

Подробнее: http://www.python.org/doc/2.5/lib/module-xml.parsers.expat.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...