首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析python超大xml文件时遇到的问题

解析python超大xml文件时遇到的问题
EN

Stack Overflow用户
提问于 2012-12-29 20:31:17
回答 3查看 3.7K关注 0票数 2

我有一个很大的xml文件(大约84MB),格式如下:

代码语言:javascript
复制
<books>
    <book>...</book>
    ....
    <book>...</book>
</books>

我的目标是提取每一本书并获取其属性。我尝试解析它(就像我对其他xml文件所做的那样),如下所示:

代码语言:javascript
复制
from xml.dom.minidom import parse, parseString

fd = "myfile.xml"
parser = parse(fd)
## other python code here

但是代码似乎在parse指令中失败了。为什么会发生这种情况,我该如何解决?

我应该指出,该文件可能包含希腊语、西班牙语和阿拉伯语字符。

这是我在ipython中得到的输出:

代码语言:javascript
复制
In [2]: fd = "myfile.xml"

In [3]: parser = parse(fd)
Killed

我想指出的是,计算机在执行过程中会冻结,因此这可能与内存消耗有关,如下所述。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-29 21:50:00

我强烈建议在这里使用SAX解析器。我不建议对超过几兆字节的任何XML文档使用minidom;我见过它在大约10MB的XML文档中使用大约400MB的内存读取。我怀疑你遇到的问题是由minidom请求太多内存引起的。

Python附带了一个XML SAX解析器。要使用它,请执行类似以下操作。

代码语言:javascript
复制
from xml.sax.handlers import ContentHandler
from xml.sax import parse

class MyContentHandler(ContentHandler):
    # override various ContentHandler methods as needed...


handler = MyContentHandler()
parse("mydata.xml", handler)

您的ContentHandler子类将覆盖ContentHandler中的各种方法(如startElementstartElementNSendElementendElementNScharacters。它们处理SAX解析器在读取XML文档时生成的事件。

与DOM相比,SAX是一种更“低级”的处理XML的方法;除了从文档中提取相关数据之外,ContentHandler还需要跟踪它当前所在的元素。但是,从好的方面来看,由于SAX解析器不会将整个文档保存在内存中,因此它们可以处理任何大小的XML文档,包括那些比您的文档大的文档。

我还没有尝试过在这种大小的XML文档上使用其他DOM解析器,比如lxml,但我怀疑lxml解析XML文档仍然需要相当长的时间和大量的内存。如果您每次运行代码时都必须等待它读入一个84MB的XML文档,这可能会减慢您的开发速度。

最后,我不相信你提到的希腊语、西班牙语和阿拉伯语字符会造成问题。

票数 6
EN

Stack Overflow用户

发布于 2012-12-29 21:09:03

尝试使用lxml,它更易于使用。

代码语言:javascript
复制
#!/usr/bin/env python
from lxml import etree

with open("myfile.xml") as fp:
    tree = etree.parse(fp)
    root = tree.getroot()

    print root.tag

    for book in root:
        print book.text
票数 7
EN

Stack Overflow用户

发布于 2012-12-29 21:03:49

有两种XML解析器(这适用于任何语言)。

  1. DOM解析(这就是您正在使用的)。在这种类型中,整个XML文件被读取到内存结构中,然后通过方法访问。

  1. 、SAX解析。这是一个解析算法,它以一步一步的方式读取每一段XML。此技术将使您能够更好地检测和处理错误。

一般来说,DOM比SAX更容易,因为很多复杂的细节都是由它的本机方法处理的。

SAX更具挑战性,因为您必须编写SAX解析在遍历XML文档期间“运行”的方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14081701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档