加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-20 13:32:55 所属栏目:Python 来源:网络整理
导读:我有点担心哪种方式最好处理一个必须隔离信息的文件. 例如,想象一个日志文件,其中数据以块为单位划分,每个块都有一个子块列表. 日志文件示例: datadatadatadata block 1 start -sub block 1 start --data x --data y -sub block 1 end -sub block 2 start -
我有点担心哪种方式最好处理一个必须隔离信息的文件.

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

日志文件示例:

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很新,所以我不确定如何面对类似问题的方法.希望这里有人有类似的问题,所以可以建议我面对这个问题的最佳方式.

解决方法

对于日志文件,当我解析文件时,我会抛弃我不在乎的行,填充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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读