4

我有点担心哪种方式最适合处理包含必须隔离的信息的文件。

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

日志文件示例:

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结束”逐行复制)并检查好数据是否在那个子堵塞。如果是,我会将列表内容复制到最终列表,否则我将删除列表并从下一个子块开始。

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

4

2 回答 2

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
于 2013-02-04T01:02:00.793 回答
0

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

于 2013-02-04T01:09:50.373 回答