工作需要解析log中的内容,要将log中的一些固定格式的内容取出。平时使用C++开发,python是入门级,正则则是现学现买。 一个log解析的工具,使用C++开发感觉太费时,于是用了python。
首先log里的内容是这样子的:
log:Debug:··········(各种内容)
log:info:··········(各种内容)
log:warn:··········(各种内容)
工作内容就是在这各种内容里找到 {数值1;数值2.1,数值2.3;字串}这种格式的内容,并把数据解析出来保存到excel文件中。
0.导入需要的库
import re
import xlsxwriter
1.读取log文件
with open("ConnServer.txt", mode='r') as file:
for line in file:
使用迭代的方法读取,以免遇到大文件导致内存不足的异常。
2.在每行中找特定格式的内容
res = re.findall('{[^}]+}', line, re.S)
if 0 == len(res):
continue
使用正则表达式 {[^}]+} 。这个正则表达式能很好的匹配一条目标格式的内容。如果用{.^}处理连续的目标内容(比如 目标内容1目标内容2目标内容3)就不能讲这些内容单独的分开。在开始的时候用match,因为match是从首字符开始匹配正则表达式,所以得到返回结果都是None。search可以在给定的字符串中查找知道找到匹配的内容,findall也是能在给定的字符串中查找直到找到匹配的内容。使用findall是因为返回值是list类型,比较适合入门选手来处理······
3.分析每一个目标内容
log = log.replace("{", ";")
log = log.replace("}", ";")
log = log.replace(",", ";")
data = []
res = re.findall(';[^;]+', log, re.S)
首先把目标内容中的 “{” 和 “,”都替换成“;”方便接下来使用正则表达式拆出每个数据。用;[^;]+解析修改过的log,这样res中保存的都是以 “;”开头的字符串,而且“;”就是每个数据。然后直接截取string中的内容就可以得到数据了。
4.保存数据到excel中
file = xlsxwriter.Workbook("Data.xlsx")
row = 0
tableIndex = 1
table = file.add_worksheet(str(tableIndex))
for data in dataList:
if row >= MaxRowIndex:
tableIndex += 1
row = 0
table = file.add_worksheet(str(tableIndex))
col = 0
for value in data:
table.write(row,col,value)
col += 1
row += 1
file.close()
使用xlwt写excel的话只能保存为xls格式,xls格式最多支持65536行,超过的话python会抛出异常。xlsxwriter可以保存为xlsx格式最多支持1048576行。考虑到数据还是有可能超出,所以对每张sheet写入的行数做了限制,超过后新建sheet |