python - 带生成器的日志解析器
问题描述
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
解决方案
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}')
推荐阅读
- matlab - 为 simulink 模型优化而完成的 Matlab 代码
- ios - 我可以在 Swift 中使用自定义集合视图而不是分段控制吗?
- c# - 如何将具有相同逻辑的两个方法组合成一个泛型方法
- java - 从 Lucene 索引输出中提取特定的信息对
- python - builtins.TypeError: __init__() 有一个意外的关键字参数“设置”
- haskell - Haskell 加速复制矩阵
- kubernetes - OpenShift / OKD 单节点集群
- c# - 关注 C# 中的第一个空文本框
- yahoo-finance - 为什么 yahoo Finance API 返回的报价小于美分?
- python - AttributeError:“课程”对象没有属性“等级”