我正在尝试解析*大型文件(> 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)
| 归档时间: |
|
| 查看次数: |
1842 次 |
| 最近记录: |