[英]Finding separating and processing repeatative blocks of lines with Python
我写了脚本来分析包含要查找的行的文本:
Uplink Bytes: 6168 Downlink Bytes: 40366
Uplink Packets: 69 Downlink Packets: 72
Access list name Pkts-Down Bytes-Down Pkts-Up Bytes-Up
tcp 14 3763 15 1622
web 58 36603 54 4546
<....>
它对具有单独访问列表(例如tcp和web)的字符串的列中的数字求和,然后将其与前2个字符串中的总数进行比较。 我编写了程序,该程序借助这三种类型的字符串的正则表达式和结果组来完成这项工作。
现在,我正在考虑如果文本中很少有这样的输出,如何使它起作用? 最优雅的实现方式是什么? 我知道我需要在处理完第一个块后将计数器重置为0,然后再次搜索所有这3种类型的字符串,但是如何做到最好? 这是当前的脚本:
import re
with open(input_file) as f:
d_b = 0
d_p = 0
u_b = 0
u_p = 0
lines = f.readlines()
for line in lines:
res = re.search('Uplink B\w+: +(\d+) +Downlink \w+: +(\d+)',line)
if (res):
s_u_b = int(res.group(1))
s_d_b = int(res.group(2))
res = re.search('Uplink P\w+: +(\d+) +Downlink \w+: +(\d+)',line)
if (res):
s_u_p = int(res.group(1))
s_d_p = int(res.group(2))
res = re.search('^[0-9a-zA-Z-_]+\ +(\d+) +(\d+) +(\d+) +(\d+) +\d+',line)
if (res):
d_p += int(res.group(1))
d_b += int(res.group(2))
u_p += int(res.group(3))
u_b += int(res.group(4))
if (d_b == s_d_b) and (u_b == s_u_b)
and (d_p == s_u_p) and (u_p == s_u_p):
print("No mismatch between subsession stats and ECS stats found")
else :
print("Mismatch between subsession stats and ECS stats found:")
我将引入块边界的概念,当您将一行与"Uplink Bytes:"
或空行(如果这些块之间存在一个)匹配时,就会看到这种情况。
当您检测到进入新块时,将重置所有计数器。
您仍然可以一一处理所有行。
根据要对每个块计算的数据的处理方式,可能需要将所有计数器和一些相关代码封装到一个小类中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.