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
.
file_name = 'events.txt' parse = Parser(file_name=file_name) parse.run()
Эти комментарии должны быть правками в вопросе, а не комментариями.
Если этот код работает правильно, Обзор кода может быть лучшим местом для публикации.
Вы могли бы быть более конкретным, поскольку «последнее еще» уже очень просто, я думаю, вы имеете в виду предпоследнее еще. Кроме того, вместо того, чтобы просто вставлять весь код, вы должны вставить ту часть, в которой вам нужна помощь.
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}')
пример 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] ОК