运用到的python知识点:

excel相关:https://www.cnblogs.com/yaner2018/p/11269873.html

字典:

python字典的几种方式:

1)key值遍历

1 d = {'a': '1', 'b': '2', 'c': '3'}
2
3 for k in d:
4     print(k+':'+d[k])
5 print('------------')
6
7 for k in d.keys():
8     print(k+':'+d[k])
key值遍历
1 a:1
2 b:2
3 c:3
4 ------------
5 a:1
6 b:2
7 c:3
运行结果

for k in d: 与 for k in d.keys(): 完全等价

2)value遍历

1 d = {'a': '1', 'b': '2', 'c': '3'}
2
3 for v in d.values():
4     print(v)
5
6 运行结果
7 1
8 2
9 3
value遍历

 3)遍历字典项

1 d = {'a': '1', 'b': '2', 'c': '3'}
2
3 for kv in d.items():
4     print(kv)
5
6 运行结果
7 ('a', '1')
8 ('b', '2')
9 ('c', '3')
字典项遍历

4)字典键、值 遍历

 1 d = {'a': '1', 'b': '2', 'c': '3'}
 2
 3 for (k,v) in d.items():
 4     print(k,':',v)
 5 print('----------')
 6 for k,v in d.items():
 7     print(k,':',v)
 8
 9
10 运行结果
11 a : 1
12 b : 2
13 c : 3
14 ----------
15 a : 1
16 b : 2
17 c : 3
字典键、值遍历

for (k,v) in d.items():  根据运行结果可见,k,v是否加括号是一样的

 os模块:

os.getcwd():查看当前所在路径。

os.listdir(path):列举目录下的所有文件。返回的是列表类型

os.path.abspath(path):返回path的绝对路径。

os.path.split(path):将路径分解为(文件夹,文件名),返回的是元组类型

os.path.join(path1,path2,...):将path进行组合,若其中有绝对路径,则之前的path将被删除

os.path.dirname(path):返回path中的文件夹部分,结果不包含'\'

os.path.basename(path):返回path中的文件名

 os.path.getmtime(path):文件或文件夹的最后修改时间,从新纪元到访问时的秒数

 os.path.getatime(path):文件或文件夹的最后访问时间,从新纪元到访问时的秒数

 os.path.getctime(path):文件或文件夹的创建时间,从新纪元到访问时的秒数

  os.path.getsize(path):文件或文件夹的大小,若是文件夹返回0

 os.path.exists(path):文件或文件夹是否存在,返回True 或 False

os.path.isfile(path):该目录是否为一个文件,返回True 或 False

os.path.isdir(path):该目录是否为一个文件夹,返回True 或 False

其他:

strip():去空格

split():分隔

slice:切片

-----------------------------------------------------------------------

 案列:

log:

从以上大篇幅的log中提取出如下信息:

sn,mode,time 相同的只统计一次,loc统计不重复的位置

 content:SN=56636200000686;MODE=0;TIME=2019-9-18 8:58:39;LOC=0-460,0,6338,20935,8,31,0,24-460,0,6338,20935,8,31,0,24-460,0,6338,20935,8,31,0,24;TEST_NUM=248;LOC_ERR=26;CONN_ERR=10;SEND_ERR=2;REC_ERR=0

  1 #coding=utf-8
  2 '''
  3 Created on 2019年9月17日
  4
  5 @author: yanerfree
  6 '''
  7 import re
  8 import xlrd
  9 from xlutils.copy import copy
 10 import os
 11 #import shutil
 12
 13 class recorder():
 14     def __init__(self,sn,mode,dat):
 15         self.sn = sn
 16         self.mode = mode
 17         self.dat = dat#日期
 18         self.loc = []
 19         self.test_num = 0
 20         self.loc_err = 0
 21         self.conn_err = 0
 22         self.send_err = 0
 23         self.rec_err = 0
 24
 25
 26     def updateInfo(self,str):
 27         print('------更新条目信息------')
 28         pattern_2 = re.compile('content:SN=(.*?);MODE=(.*?);TIME=(.*?) .*?LOC=(.*?);TEST_NUM=(.*?);LOC_ERR=(.*?);CONN_ERR=(.*?);SEND_ERR=(.*?);REC_ERR=(\d*)' ,re.S)
 29         res = re.findall(pattern_2, str)[0]
 30         print('res:',res)
 31         #将loc不同的收集起来
 32         loclist = res[3].split(',')
 33         loc34 = '['+loclist[2]+','+loclist[3]+']'
 34         print('loc34:',loc34)
 35         if loc34 not in self.loc:
 36             #print('loc34:',loc34)
 37             self.loc.append(loc34)
 38
 39         if int(res[4]) > self.test_num:#此处必须将字符类型转换成整数类型进行比较
 40             self.test_num = int(res[4])
 41             self.loc_err = int(res[5])
 42             self.conn_err = int(res[6])
 43             self.send_err = int(res[7])
 44             self.rec_err = int(res[8])
 45
 46     def setInfo(self,str):
 47         print('创建新条目:',str)
 48         pattern_2 = re.compile('content:SN=(.*?);MODE=(.*?);TIME=(.*?) .*?LOC=(.*?);TEST_NUM=(.*?);LOC_ERR=(.*?);CONN_ERR=(.*?);SEND_ERR=(.*?);REC_ERR=(\d*)' ,re.S)
 49         res = re.findall(pattern_2, str)[0]
 50         loclist = res[3].split(',')
 51         print('loclist:',loclist)
 52         loc34 = '['+loclist[2]+','+loclist[3]+']'
 53         print('loc34:',loc34)
 54         self.loc= [loc34]
 55         self.test_num = int(res[4])
 56         self.loc_err = int(res[5])
 57         self.conn_err = int(res[6])
 58         self.send_err = int(res[7])
 59         self.rec_err = int(res[8])
 60
 61
 62
 63 def washdata(filepath,pattern):
 64     f = open(filepath,'r',encoding='utf-8')
 65     cls_dic = {}#class对象
 66
 67     line = f.readline().strip()#去空格、换行
 68     while line:
 69         #print('line:',line)
 70         res=re.findall(pattern,line)
 71         #print('res:',res)
 72         #print('len(res):',len(res))
 73
 74         if len(res) == 1:
 75             info_list = re.findall(pattern_1,res[0])[0]
 76             print('info_list:',info_list)
 77             sn = info_list[0]
 78             mode = info_list[1]
 79             dat = info_list[2]
 80             flag = 0#该对象是否已经创建,1是已创建,直接更新信息即可
 81             for key,cls in cls_dic.items():
 82                 if cls.dat == dat and cls.sn == sn and cls.mode == mode:
 83                     cls.updateInfo(res[0])
 84                     flag = 1
 85             if flag == 0:
 86                 #新建一个class
 87                 cls_name = 'record'+str(len(cls_dic))
 88                 cls_dic[cls_name] = recorder(sn,mode,dat)
 89                 cls_dic[cls_name].setInfo(res[0])
 90
 91         line = f.readline()
 92
 93     f.close()
 94     return cls_dic
 95
 96 #对单个文件操作
 97 def writetoexcel(cls_dic,savefilename):
 98     print('------将数据写到excel中------')
 99     #遍历cls_dic
100     workbook1 =  xlrd.open_workbook(savefilename)
101     rows = workbook1.sheet_by_index(0).nrows
102     workbook2 = copy(workbook1)#拷贝一份原来的excel
103     #根据名字获取指定sheet页
104     sheet=workbook2.get_sheet('Sheet1')
105     row = rows
106     print('excel中已有数据%d行'%rows)
107
108     for k,c in cls_dic.items():
109         sheet.write(row, 0, c.dat)
110         sheet.write(row, 1, c.sn)
111         sheet.write(row, 2, c.mode)
112         sheet.write(row, 3, c.loc)
113         sheet.write(row, 4, c.test_num)
114         sheet.write(row, 5, c.loc_err)
115         sheet.write(row, 6, c.conn_err)
116         sheet.write(row, 7, c.send_err)
117         sheet.write(row, 8, c.rec_err)
118
119         row += 1
120
121     workbook2.save(savefilename)
122
123 #对多个文件操作
124 def traverse(filepath,savefilename):
125     list = os.listdir(filepath)
126     for i in range(0,len(list)):
127         #print list[i]
128         tmp_path = os.path.join(filepath,list[i])
129         #print tmp_path
130         if os.path.isfile(tmp_path):
131             if tmp_path[-4:] == ".txt":
132                 print('需要抓取信息的文件为 :',tmp_path)
133                 cls_dic = washdata(tmp_path,pattern)
134                 writetoexcel(cls_dic,savefilename)
135         else:
136             traverse(tmp_path,savefilename)
137
138
139 savefilename = './result.xls'
140 pattern = re.compile('(content:SN=.*?;REC_ERR=\d*)' ,re.S)
141 pattern_1 = re.compile('content:SN=(.*?);MODE=(.*?);TIME=(.*?) .*?LOC=(.*?);TEST_NUM=(.*?);LOC_ERR=(.*?);CONN_ERR=(.*?);SEND_ERR=(.*?);REC_ERR=(\d*)' ,re.S)
142
143 if __name__ == '__main__':
144     '''
145     #suite for single file
146     cls_dic = washdata(filepath,pattern)
147     writetoexcel(cls_dic,savefilename)
148     '''
149     #suite for more than one file
150     filepath = r'F:\02_testcase\log_P6_test'
151     savefilename = './result.xls'
152     traverse(filepath,savefilename)
153
154     print('------End------')
155     
extractInfo
02-14 04:03