代码之家  ›  专栏  ›  技术社区  ›  bgoncalves

在python中从大量xml文件中提取信息的最有效方法是什么?

  •  3
  • bgoncalves  · 技术社区  · 17 年前

    我的目录已满(~10 3. , 10 4. )我需要从XML文件中提取几个字段的内容。 我测试了不同的xml解析器,由于我不需要验证内容(昂贵),我想简单地使用xml.parsers.expat(最快的一个)逐一浏览文件以提取数据。

    1. 有更有效的方法吗?(简单的文本匹配不起作用)
    2. 我是否需要为每个新文件(或字符串)发出一个新的ParserCreate(),或者我可以为每个文件重用相同的ParserCeate()?
    3. 有什么警告吗?

    谢谢!

    4 回复  |  直到 14 年前
        1
  •  4
  •   Torsten Marek    17 年前

    通常,我建议使用ElementTree的 iterparse ,或者为了获得额外的速度,它的对应物来自 lxml 。也尝试使用 Processing (2.6内置)以实现并行化。

    重要的是 iterparse 就是在解析元素(子)结构时获得它们。

    import xml.etree.cElementTree as ET
    xml_it = ET.iterparse("some.xml")
    event, elem = xml_it.next()
    

    event 将始终是字符串 "end" 在这种情况下,但您也可以初始化解析器,以便在解析新元素时告诉您有关新元素的信息。你不能保证所有的子元素都会在那时被解析,但如果你只对此感兴趣,属性就在那里。

    另一点是,您可以在早期停止从迭代器读取元素,即在处理整个文档之前。

    如果文件很大(是吗?),有一个常见的习惯用法是保持内存使用恒定,就像在流解析器中一样。

        2
  •  3
  •   orip    17 年前

    最快的方法是匹配字符串(例如,使用正则表达式),而不是解析XML——这取决于您的XML,这实际上是可行的。

    但最重要的是:与其考虑几个选项,不如实施它们并在一个小集合上计时。这将花费大约相同的时间,并且会给你真实的数字,从而推动你前进。

    编辑:

    • 文件是在本地驱动器还是网络驱动器上?网络I/O会杀了你。
    • 这个问题很容易并行化——你可以在几台计算机(或多核计算机上的几个进程)之间分配工作。
        3
  •  1
  •   Martin v. Löwis    17 年前

    如果您知道XML文件是使用相同的算法生成的,那么根本不进行任何XML解析可能会更有效。例如,如果你知道数据在第3、4和5行,你可以逐行读取文件,然后使用正则表达式。

    当然,如果文件不是机器生成的,或者来自不同的生成器,或者生成器随时间变化,这种方法就会失败。然而,我对此持乐观态度 将 更高效。

    是否回收解析器对象在很大程度上无关紧要。将创建更多的对象,因此单个解析器对象并不重要。

        4
  •  1
  •   Robert Rossney    17 年前

    您没有指出的一件事是,您是否正在将XML读取到某种DOM中。我猜你可能没有,但如果你有机会的话,不要这样做。用xml.sax代替。使用SAX而不是DOM将显著提高性能。