我有一个我想用python解析的XML文件.什么是最好的方法呢?考虑到内存整个文档将是灾难性的,我需要以某种方式一次读取一个节点.
我所知道的现有XML解决方案:
>元素树
> minixml
但是因为我提到的问题,我担心他们不会上班.另外我无法在文本编辑器中打开它 – 用于处理巨型文本文件的任何关于genrao的好技巧?
解决方法:
首先,您是否尝试过ElementTree(内置的纯Python或C版本,或者更好的是lxml版本)?我很确定他们中没有人真正将整个文件读入内存.
当然,问题在于,无论是否将整个文件读入内存,生成的已解析树最终都会在内存中结束.
ElementTree有一个非常简单的漂亮解决方案,通常就足够了:iterparse.
for event, elem in ET.iterparse(xmlfile, events=('end')):
...
这里的关键是你可以在构建时修改树(通过用仅包含父节点所需内容的摘要替换内容).通过丢弃所有你不需要保留在内存中的东西,你可以坚持以通常的顺序解析东西,而不会耗尽内存.
链接页面提供了更多详细信息,包括在处理XML-RPC和plist时修改的一些示例. (在这些情况下,它是使得生成的对象更易于使用,而不是为了节省内存,但它们应该足以让想法得到解决.)
这只有在你能够想到一种总结的方法时才有用. (在最简单的情况下,父母不需要其子女的任何信息,这只是elem.clear().)否则,这对你不起作用.
标准解决方案是SAX,它是一个基于回调的API,允许您一次在树上操作一个节点.您不必像使用iterparse那样担心截断节点,因为在解析它们之后节点不存在.
大多数最好的SAX示例都是针对Java或Javascript的,但它们并不难理解.例如,如果你看一下http://cs.au.dk/~amoeller/XML/programming/saxexample.html,你应该能够弄清楚如何用Python编写它(只要你知道在哪里找到the documentation for xml.sax).
还有一些基于DOM的库可以在不将所有内容读入内存的情况下工作,但我所知道的并不是我所知道的,它能够以合理的效率处理40GB的文件.