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

2024-10-04 01:31:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个完整的目录(~103,104),我需要从中提取几个字段的内容。 我已经测试了不同的xml解析器,由于不需要验证内容(代价昂贵),所以我想简单地使用xml.parsers.expat(最快的一个)遍历文件,逐个提取数据。在

  1. 有没有更有效的方法?(简单的文本匹配不起作用)
  2. 我需要为每个新文件(或字符串)发出一个新的ParserCreate(),还是可以对每个文件重复使用同一个?在
  3. 有什么注意事项吗?在

谢谢!在


Tags: 文件数据方法字符串文本目录解析器内容
3条回答

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

但最重要的是:与其考虑几个选项,不如实现它们并在一个小范围内确定时间。这将花费大致相同的时间,并将给你真实的数字确实推动你前进。在

编辑:

  • 文件在本地驱动器还是网络驱动器上?网络I/O会在这里杀了你。在
  • 这个问题可以简单地并行化——你可以在多台计算机(或多核计算机上的多个进程)之间分割工作。在

通常,我建议使用ElementTree的^{},或者为了提高速度,使用它的对应于lxml。还可以尝试使用Processing(2.6内置)来并行化。在

关于iterparse的重要一点是,当元素(子)结构被解析时,就可以得到它们。在

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

在本例中,event将始终是字符串"end",但您也可以初始化解析器,以便在解析新元素时也告诉您新元素。你不能保证所有的子元素都会在那时被解析,但是属性在那里,如果你只对它感兴趣的话。在

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

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

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

当然,如果文件不是机器生成的,或者来自不同的生成器,或者生成器随着时间的推移而改变,那么这种方法将失败。然而,我乐观地认为它会更有效。在

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

相关问题 更多 >