我对哪种方式处理具有必须隔离的信息的文件感到担忧。
例如,想象一个日志文件,其数据以块为单位划分,每个块都有一个子块列表。
日志文件示例:
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很新,所以我不确定如何面对类似问题的方法。希望这里有人有类似的问题,所以可以建议我面对这个问题的最好方法。
答案 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 ... start
和block ... end
识别块或子块边界,则可以在读取时处理每个块并将结果存储在任何需要的位置。