(Python)解析文件以避免性能问题的最佳方法

时间:2013-02-04 00:31:41

标签: python

我对哪种方式处理具有必须隔离的信息的文件感到担忧。

例如,想象一个日志文件,其数据以块为单位划分,每个块都有一个子块列表。

日志文件示例:

data
data
data
data 
   block 1 start
    -sub block 1 start
    --data x
    --data y
    -sub block 1 end
    -sub block 2 start
    --data x
    --data marked as good
    --data z
    -sub block 2 end
    block 1 end
    block 1 summary

    block 2 start
    -sub block 1 start
    .....
    -sub block 1 end
    ....
data
data
data

我正在寻找一种有效的方法来解析更大的文件(这是各种文本的mb),隔离块然后在每个块中检查子块中的特定行。如果该行在子块中,我将保存子块所属的块起始行和结束行,以及行所在的子块(但将丢弃其他没有数据的子块)。直到我到达文件的末尾。

结果应如何显示的示例:

block 1 start
-sub block 2 start
--data marked as good
-sub block 2 end
block 1 summary
.....

现在我正在使用这种方法: 我打开文件,然后将文件分成较小的子集来处理;我有3个收集信息的列表。

第一个名为List_general的列表将包含整个日志文件中解析的结果,减去与我需要隔离的块无关的内容。基本上在这一步之后,我将只有上面例子中的块,减去“数据”行。当我这样做时,我检查“好数据”字符串,所以如果我看到该字符串至少一次,这意味着我需要处理和保存数据,否则我只是结束该功能。

如果有要处理的数据,我会逐行进入list_general并开始隔离每个块和子块。从第一个块开始(所以从块1开始到块1摘要,如果你看一下例子)。

一旦我到达了一个块的结尾(块1摘要);如果有标记为良好的数据,我将开始解析它,通过每个子块找到哪个具有良好的数据。

我将逐行复制每个子块,就像我对块所做的那样(基本上开始逐行从“子块1开始”复制到“子块1结束”)并检查好的数据是否是在那个子块中。如果是,我将列表内容复制到最终列表,otehrwise我将删除列表并从下一个子块开始。

我知道解析每个部分的这种机制非常繁琐且资源昂贵;所以我想知道是否有一种“更好”的方式来做到这一点。我对python很新,所以我不确定如何面对类似问题的方法。希望这里有人有类似的问题,所以可以建议我面对这个问题的最好方法。

2 个答案:

答案 0 :(得分:1)

对于日志文件,我会在解析文件时丢弃我不在乎的行,在sqlite中填充任何有用的东西(检查模块sqlite3)。然后在我完成解析文件后进行报告/处理。

可以将Sqlite配置为使用磁盘或内存作为存储 - 因此您可以根据需要进行选择。

我喜欢这种方法,它是灵活的,我不需要解析任何两次。

补充:有类似的东西吗?

class Parser:
    def __init__(self, logfile):
        self.log = open(logfile)
        self.logentry = []
    def next(self):
        found = False
        for line in self.log:
            self.logentry.append(line)            
            if <block ends>:
                e = '\n'.join(self.logentry)
                self.logentry = []
                yield e

答案 1 :(得分:0)

如果您只使用block ... startblock ... end识别块或子块边界,则可以在读取时处理每个块并将结果存储在任何需要的位置。