首页 > 解决方案 > 带生成器的日志解析器

问题描述

class Parser:

    def __init__(self, file_name):
        self.file_name = file_name
        self.dates = {}
        self.j = 17
        self.date_str = ''
        self.prev = None
        self.i = 0

    def parse_file(self):
        with open(self.file_name, 'r', encoding='utf-8') as file:
            yield from file

    def filter_line(self, line):
        if 'NOK' in line:
            return line

    def get_date(self, line):
        try:
            self.date_str = line[1:self.j]
        except AttributeError:
            return None
        except ValueError:
            return None
        return self.date_str

    def run(self):
        generator = self.parse_file()
        count = 1
        prev = None
        while True:
            try:
                line = next(generator)
            except StopIteration:
                if self.get_date(prev):
                    print(self.get_date(prev), ' NOK ' + str(count) + '\n')
                break
            if self.filter_line(line):
                if prev is None:
                    if self.get_date(line):
                        prev = line
                else:
                    if self.get_date(line):
                        if self.get_date(line) == self.get_date(prev):
                            count += 1
                            prev = line
                        else:
                            # print(self.get_date(prev) + ' NOK ' + str(count) + '\n')
                            count = 1
                            prev = line
                            yield self.get_date(prev),count

如何简化最后一个else, 使用yield, 将计算的数据输出到控制台?使用print作品。

控制台中的结果必须是:

[2018-05-17 01:57] 1234

也许您可以进一步简化代码,例如,通过从那里parse_file删除来更改功能。yield

标签: pythonparsing

解决方案


class Parser:
    def __init__(self, file_name):
        self.file_name = file_name
        self.j = 17

    def parse_file(self):
        with open(self.file_name, "r", encoding="utf-8") as file:
            yield from file

    def run(self):

        count = 1
        prev = None

        with open(self.file_name, "r", encoding="utf-8") as file:
            for line in file:
                if 'NOK' in line:
                    date_str = line[1:self.j]
                    if prev is None:
                        prev = date_str
                    else:
                        if date_str == prev:
                            count += 1
                            prev = date_str
                        else:
                            yield count, prev
                            count = 1
                            prev = date_str
            yield count, prev


file_name = "events.txt"
parse = Parser(file_name=file_name)

grouped_events = parse.run()

for group_time, event_count in grouped_events:
    print(f'{group_time}, {event_count}')

推荐阅读