как посчитать количество событий в файле?
Имеется файл вида:
[2018-05-17 01:55:52.665804] NOK
[2018-05-17 01:56:23.665804] OK
[2018-05-17 01:56:55.665804] OK
[2018-05-17 01:57:16.665804] NOK
[2018-05-17 01:57:58.665804] OK
...
Напишите программу, которая считывает файл и выводит число событий NOK за каждую минуту
[2018-05-17 01:57] 1234
[2018-05-17 01:58] 4321
как это вообще можно сделать? хоть в какую сторону двигаться?
with open(file_name, mode='r') as file:
for line in file:
if 'NOK' in line:
print(line)
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
Делаем парсер:
Вытаскивание даты до минут включительно
- Я делал через регулярные выражения, но можно попробовать через datetime
- Работает так:
[2018-05-17 01:55:52.665804]->2018-05-17 01:55
Сбор и подсчет строк с одинаковой датой из шага 1.
- Вывод результата
text.txt:
[2018-05-17 01:55:52.665804] NOK
[2018-05-17 01:55:55.665804] NOK
[2018-05-17 01:55:56.665804] NOK
[2018-05-17 01:56:23.665804] OK
[2018-05-17 01:56:55.665804] OK
[2018-05-17 01:57:16.665804] NOK
[2018-05-17 01:57:58.665804] OK
Пример:
from collections import defaultdict
import re
file_name = 'text.txt'
pattern_datetime = re.compile('\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}).+\]')
date_by_counter = defaultdict(int)
with open(file_name) as file:
for line in file:
if 'NOK' not in line:
continue
match = pattern_datetime.search(line)
# Проверка, что регулярка смогла найти дату
if match:
date_str = match.group(1) # Получение даты
date_by_counter[date_str] += 1
for k, v in date_by_counter.items():
print(f'[{k}] {v}')
Результат:
[2018-05-17 01:55] 3
[2018-05-17 01:57] 1
Автор решения: REPAIR SERVICE
→ Ссылка
class Logs:
def __init__(self, file_name):
self.file = None
self.date = None
self.lines = None
self.count_nok = None
self.file_content = None
self.file_name_logs = None
self.file_name = file_name
def open_and_clear_file(self):
self.file = open(self.file_name, mode='w+')
self.file_content = self.file.read()
self.file.write('')
self.file.close()
def open_and_write_file(self):
self.file_name = 'out1.txt'
self.file = open(self.file_name, mode='a')
self.file_content = f'{self.date} {self.count_nok}\n'
self.file.write(self.file_content)
self.file.close()
def file_read(self):
self.file_name_logs = 'events.txt'
self.count_nok = 0
self.date = []
self.open_file_and_sorted()
def open_file_and_sorted(self):
with open(self.file_name_logs, 'r', encoding='cp1251') as file:
file_contents = file.readlines()
file_contents.sort(key=lambda line: (line.split(' ')[0]), reverse=False)
self.append_in_list(file_contents)
def append_in_list(self, file_contents):
for line in file_contents:
if 'NOK' not in line:
continue
elif line[1:17] in self.date:
self.count_nok += 1
elif line[1:17] not in self.date:
self.write_file(line)
def write_file(self, line):
if self.count_nok > 0:
self.open_and_write_file()
self.count_reload()
self.date[0] = (line[1:17])
else:
self.count_reload()
self.date.append(line[1:17])
def count_reload(self):
self.count_nok = 0
self.count_nok += 1
def write_file_close(self):
self.open_and_write_file()
logs = Logs(file_name='out1.txt')
logs.open_and_clear_file()
logs.file_read()
logs.write_file_close()