Как реализовать класс генератора который читает log файл и за одну итерацию выдает число событий NOK за каждую минуту
Есть лог файл с информацией
[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] OK
[2018-05-14 19:39:49.873687] NOK
[2018-05-14 19:40:33.873687] NOK
[2018-05-14 19:41:05.873687] OK
[2018-05-14 19:41:46.873687] OK
[2018-05-14 19:42:29.873687] OK
[2018-05-14 19:42:55.873687] NOK
[2018-05-14 19:43:38.873687] NOK
[2018-05-14 19:43:40.873687] NOK
[2018-05-14 19:44:06.873687] OK
[2018-05-14 19:44:30.873687] NOK
[2018-05-14 19:45:12.873687] NOK
[2018-05-14 19:45:13.873687] OK
[2018-05-14 19:45:14.873687] NOK
[2018-05-14 19:45:54.873687] OK
[2018-05-14 19:46:18.873687] OK
[2018-05-14 19:46:40.873687] NOK
[2018-05-14 19:47:14.873687] NOK
[2018-05-14 19:47:38.873687] OK
[2018-05-14 19:47:55.873687] NOK
[2018-05-14 19:48:13.873687] NOK
[2018-05-14 19:48:38.873687] OK
[2018-05-14 19:48:56.873687] NOK
[2018-05-14 19:49:24.873687] NOK
[2018-05-14 19:49:25.873687] NOK
[2018-05-14 19:49:40.873687] NOK
[2018-05-14 19:49:50.873687] OK
[2018-05-14 19:50:00.873687] OK
[2018-05-14 19:50:22.873687] OK
[2018-05-14 19:50:55.873687] OK
[2018-05-14 19:51:34.873687] OK
[2018-05-14 19:51:50.873687] NOK
Я написал итерируемый класс который за одну итерацию читает только одну строку и если в строке NOK - нет, то на выходе ставится 0, если есть - 1, и добавляется по 1 за NOK при чтении следующих строк. А когда начинается строка следующей минутой счетчик обнуляется. И на выходе получается такое:
[2018-05-14 19:37] 0
[2018-05-14 19:38] 1
[2018-05-14 19:38] 1
[2018-05-14 19:38] 2
[2018-05-14 19:38] 3
[2018-05-14 19:38] 4
[2018-05-14 19:39] 0
[2018-05-14 19:39] 0
Вот этот код:
'''
class Get_event():
def __init__(self, path):
self.path = path
self.line = None
self.file = None
self.date = None
self.current_minute = None
self.minute = None
self.count = 0
def __iter__(self):
self.file = open(self.path, 'r')
return self
def __next__(self):
self.line = self.file.readline()
if self.line == '':
self.file.close()
raise StopIteration
self.minute = int(self.line[15:17])
self.sort_event()
return self.date, self.count
def sort_event(self):
if self.minute != self.current_minute:
self.count = 0
self.date = self.line[:17] + ']'
self.current_minute = self.minute
if 'NOK' in self.line:
self.count += 1
else:
self.current_minute = self.minute
self.date = self.line[:17] + ']'
if 'NOK' in self.line:
self.count += 1
path = 'F:\\events.txt'
grouped_events = Get_event(path=path)
for group_time, event_count in grouped_events:
print(f'{group_time} {event_count}')
''' А нужно чтобы за одну итерацию читалась не одна строка файла а все строки текущей минуты до строки следующей минуты, сохраняя позицию чтения для продолжения на следующей итерации и подсчитывало число "NOK" в этих строках. А при следующей итерации обнуляло счетчик и подсчитывало тоже самое число "NOK" продолжая чтения строк следующей минуты. Соответственно на выводе должно быть:
[2018-05-14 19:37] 0
[2018-05-14 19:38] 4
[2018-05-14 19:39] 1