Python学习之道-烤机测试日志Log分析统计
PS:自己学习Python已经断断续续有1年了,之前没有写博客的习惯,前段日子去图书馆借阅了《程序员的自我修养》,觉得应该养成写博客的习惯,将自己学习的过程记录下来,方便自己也方便大家,记录自己学习历程和思路,后面回顾也方便易上手。最主要的是方面自己查找 哈哈
问题引出
工作中经常需要检查样机老化烤机、可靠性环境温湿试验等诸多烤机的日志文件,并统计Log文件中的结果汇总成测试报告的数据。
痛点:
一次烤机的台数往往少则几台多则几十台,人工检查Log文件工作量大、繁索
解决思路:
通过编写Python脚本来实现对Log文件的每一行遍历分析统计,加上一些前后判断逻辑,最终输出需要的有用信息至表格文件
一、环境准备
参照网上的教程,消化吸收。
参考文档:
Python中 sys.argv[]的用法简明解释 - 覆手为云p - 博客园
笔记:
sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个“外部”很关键。
因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可以看作是一个列表,所以才能用[]提取其中的元素。其第一个元素是程序本身,随后才依次是外部给予的参数。
里边的项为用户输入的参数,关键就是要明白这参数是从程序外部输入的,而非代码本身的什么地方,要想看到它的效果就应该将程序保存了,从外部来运行程序并给出参数。
Python split()方法 | 菜鸟教程
笔记:
Python split() 通过指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串
Python 文件I/O | 菜鸟教程
二、实践代码
读取文件->遍历每行->剔除无关行->判断启动标志行->回溯上次掉电最后一行->对行切片Get数值->对数据判断记录
1、初步实现
@2019/04/08
晚上加班编写,实现分析Log并将结果打印
# -*- coding: UTF-8 -*-
import sys,time
class DisplayFormat(object):
def format_size(self,size):
'''格式化大小SIZE'''
KB = 1024 # KB -> B 1024
MB = 1048576 # MB -> B 1024 * 1024
GB = 1073741824 # GB -> B 1024 * 1024 * 1024
TB = 1099511627776 # TB -> B 1024 * 1024 * 1024
if size >= TB:
size = str(size >> 40) + 'T'
elif size < KB:
size = str(size) + 'B'
elif size >= GB and size < TB:
size = str(size >> 30) + 'G'
elif size >= MB and size < GB:
size = str(size >> 20) + 'M'
else:
size = str(size >> 10) + 'K'
return size
formatstring = '%-18s %-10s %-12s %8s %10s %10s %10s %10s %10s %10s %10s'
def echo_line(self):
'''输出头部横线'''
print (self.formatstring % ('-'*15,'-'*10,'-'*12,'-'*12,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,'-'*10,))
def echo_head(self):
'''输出头部信息'''
print (self.formatstring % ('IP','Traffic','Time','Time%',200,404,403,503,500,302,304))
def echo_error(self):
'''输出错误信息'''
print ('使用: ' + sys.argv[0] + ' filepath [number]')
def echo_time(self):
'''输出脚本执行时间'''
print ('The script is running %s second' % time.process_time())
class AnalysisFile(object):
'''文件分析处理类'''
def __init__(self):
'''初始化一个空字典'''
self.empty = {}
def split_line_todict(self,line):
'''传入文件的每一行取出0、8、9字段 生成字典 并返回这个字典'''
line_split = line.split('] ',2) ##用split讲该行的单词分割成列表,每个单词就时一个列表项目,split的默认参数是空格,所以不传递任何参数时分割空格,在英文中也就等同于分割单词
line_date = line_split[0].replace('[','') #去除中间字符,可以使用replace()函数
if 'Welcome to GkL