如何在Python中解析大文本文件?

时间:2015-03-25 03:39:07

标签: python python-2.7

我正在尝试解析一个大文本文件。文本文件实际上不是XML文件。标签看起来像这样:

<tag1>
<tagsomedata> text1 </tagsomedata>
<text> text some pattern1 </text>
</tag1>
<tag1>
<tagsomedata> text2 </tagsomedata>
<text> text some pattern2 </text>
</tag1>

等等..
我需要以下列形式输出:

text1 pattern1
text2 pattern2


我使用了BeautifulSoup,它适用于较短的文件。我正在以filetext = open(filename).read()的形式读取文件。对于较大的原始文件,它给出了分段错误11错误。
由于标签可以拆分,我无法以固定大小读取我的文件。我需要以标记方式读取文件。在上面的示例中,我将遍历“tag1”并获取每个子标签的必需值。
我也试过xml.etree.ElementTree,但它需要解析良好的XML。我尝试从XML文件手动更改一些明显的不需要的标签,但它仍然给出错误“不匹配的标签”。我有100多个文件,我无法手动更改每个文件。
请告诉我在这种情况下可以做些什么?

2 个答案:

答案 0 :(得分:0)

如果文件非常大且结构如您所示,您可以一次只读取文件中的数据标记(<tag1>.*?</1tag1>,而不是标记标记)并对其运行正则表达式。这种方法的优点是实现起来非常快,运行速度快,并且可以抵御文件损坏。缺点包括如果你有复杂的嵌套XML,那就很脆弱。

如果您已正确构建XML,则更灵活的方法是使用SAX解析器。这种方法的优点是它更灵活,更便携,并且与其他XML解析器相比,它降低了内存需求。缺点包括运行速度较慢 - 如果您说要解析数据TB,则需要考虑。

答案 1 :(得分:0)

如果文件是格式良好的XML文件,则可以使用Python中的SAX API之一。这是DOM api的替代方法,它允许您逐步解析文件而不将其全部加载到内存中。 API要求您为每个标记的打开和关闭实现回调。您可以使用它来将收集数据构建到最终的数据结构中,并在不将整个文件读入内存的情况下完成整个过程(这是我认为大多数基于DOM的API所做的事情)。