Парсер логов с генератором

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.

пример events.txt [2018-05-14 19:37:47.873687] OK [2018-05-14 19:38:25.873687] NOK [2018-05-14 19:38:39.873687] OK [2018-05-14 19 :38:48.873687] NOK [2018-05-14 19:38:50.873687] NOK [2018-05-14 19:38:58.873687] NOK [2018-05-14 19:39:43.873687] OK [2018-05- 14 19:39:46.873687] ОК

Iceforest 14.12.2020 13:40

file_name = 'events.txt' parse = Parser(file_name=file_name) parse.run()

Iceforest 14.12.2020 13:40

Эти комментарии должны быть правками в вопросе, а не комментариями.

Ignacio Vergara Kausel 14.12.2020 13:42

Если этот код работает правильно, Обзор кода может быть лучшим местом для публикации.

MegaIng 14.12.2020 13:51

Вы могли бы быть более конкретным, поскольку «последнее еще» уже очень просто, я думаю, вы имеете в виду предпоследнее еще. Кроме того, вместо того, чтобы просто вставлять весь код, вы должны вставить ту часть, в которой вам нужна помощь.

OuuGiii 14.12.2020 15:34
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
190
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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}')

Другие вопросы по теме