例如,想象一个日志文件,其中数据以块为单位划分,每个块都有一个子块列表.
日志文件示例:
datadatadatadata 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 ....datadatadata
我正在寻找一种有效的方法来解析更大的文件(这是各种文本的mb),隔离块,然后在每个块中检查子块中的特定行.如果该行在子块中,我将保存子块所属的块起始行和结束行,以及行所在的子块(但将丢弃其他没有数据的子块).直到我到达文件的末尾.
结果应如何显示的示例:
block 1 start-sub block 2 start--data marked as good-sub block 2 endblock 1 summary.....
现在我正在使用这种方法:
我打开文件,然后将文件分成较小的子集来处理;我有3个收集信息的列表.
第一个名为List_general的列表将包含整个日志文件中解析的结果,减去与我需要隔离的块无关的内容.基本上在这一步之后,我将只有上面例子中的块,减去“数据”行.当我这样做时,我检查“好数据”字符串,所以如果我看到该字符串至少一次,这意味着我需要处理和保存数据,否则我只是结束该功能.
如果有要处理的数据,我会逐行进入List_general并开始隔离每个块和子块.从第一个块开始(所以从块1开始到块1汇总,如果你看一下例子).
一旦我到达一个块的结尾(块1摘要);如果有标记为良好的数据,我将开始解析它,通过每个子块找到哪个具有良好的数据.
我将逐行复制每个子块,就像我对块所做的那样(基本上开始逐行从“子块1开始”复制到“子块1结束”)并检查好数据是否在该子块中块.如果是,我将列表内容复制到最终列表,otehrwise我将删除列表并从下一个子块开始.
我知道这种解析每个部分的机制非常繁琐且资源昂贵;所以我想知道是否有一种“更好”的方式来做到这一点.我对python很新,所以我不确定如何面对类似问题的方法.希望这里有人有类似的问题,所以可以建议我面对这个问题的最佳方式.
解决方法 对于日志文件,当我解析文件时,我会抛弃我不在乎的行,填充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总结
以上是内存溢出为你收集整理的(Python)解析文件以避免性能问题的最佳方法全部内容,希望文章能够帮你解决(Python)解析文件以避免性能问题的最佳方法所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)