在python中解析大型伪xml文件

Pet*_*fer 6 python xml

我正在尝试解析*大型文件(> 5GB)的结构化标记数据.数据格式本质上是XML,但没有明确的根元素.最有效的方法是什么?

SAX解析器的问题是它们需要一个根元素,所以要么我要在数据流中添加一个伪元素(在Python中是否相当于Java的SequenceInputStream?)或者我要切换到非SAX符合基于事件的解析器(是否有sgmllib的后继?)

数据结构非常简单.基本上是元素列表:

<Document>
  <docid>1</docid>
  <text>foo</text>
</Document>
<Document>
  <docid>2</docid>
  <text>bar</text>
</Document>
Run Code Online (Sandbox Code Playgroud)

*实际上是迭代

lio*_*ori 11

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

请注意,您可以将"stream"对象传递给xml.sax.parse.这意味着您可以将任何具有类文件方法(如read)的对象传递给parse调用...创建自己的对象,首先将您的虚拟根开始标记,然后是文件内容,然后是虚拟根结束 -标签.我想你只需要实现read方法......但这可能取决于你将使用的sax解析器.

适用于我的示例:

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

  • python中类似流的对象的一个​​属性是read()调用阻塞并返回至少一个字节,或者在EOF的情况下,返回空字符串.这就是原始file.read方法的工作原理. (4认同)
  • `ElementTree.iterparse()`可以用作SAX的更方便的替代品. (2认同)