首页 > 解决方案 > Python - 过滤超大 XML 文件

问题描述

我有一个未压缩的维基百科转储约为 75 GB(压缩:~16 GB)。我尝试过使用类似的东西

from xml.etree.ElementTree import iterparse

for event, elem in iterparse('enwiki-latest-pages-articles-multistream.xml'):
    if elem.tag == "___":
        #do something
        elem.clear()

一段时间后,内核最终在 Jupyter Notebook 中死亡。问题是我不想要这个转储中的所有数据(大约 1000M 行)——我只想为几个实体过滤它。但要做到这一点,我必须先阅读它,对吧?这似乎是导致内核死亡的原因。我只想要它的一个非常小的子集,并想看看是否有办法在 Jupyter 中完成这种过滤,例如大型 XML 文件。

标签: pythonxml-parsingjupyter-notebook

解决方案


但要做到这一点,我必须先阅读它,对吧?

实际上,没有。

一般来说,有两种处理 XML 数据的方法。一种方法确实“将其全部读入内存”,一次创建一个内存数据结构。但是另一种方法,通常称为 SAX,读取 XML 文件并在代码中的指定点调用“处理程序”。文件可以任意大。

还有另一种称为“XPath 表达式”的技术。这使您可以构造一个字符串,告诉 XPath 引擎您要查找哪些节点。然后 XPath 会返回一个对应节点的列表给您。 不必“编写程序”(!)来获得所需的结果,只要 XPath 可以为您完成工作。(我推荐使用libxml2,这是一个行业标准的二进制引擎来做这种事情。请参阅如何在 Python 中使用 Xpath?


推荐阅读