持续创作,加速成长!这是我参与「掘金日新计划 · 12月更文挑战」的第3天,点击查看活动详情。
在上一篇文章中已经介绍过如何通过python脚本的方式巡检网络设备,但是还有一个功能没有完善的,就是把内容提取到execl表格中去。今天就把这个功能继续完善一下。
思路
在通过脚本巡检后,把巡检的结果保存成文本后,并规范命名方式,命名方式使用IP+时间的形式。如下:
可以把这个功能分成四个小步骤,如下
1、读取巡检结果记录
通过python的内置函数,读入文本的内容,核心代码如下:
def scanFile(path):
"""
param: path
return: list
扫描当前路径下的巡检日志
"""
fileList = os.listdir(path)
return [ filename for filename in fileList if filename.endswith(".txt") ]
上述代码的功能是扫描特定目录下所有以txt结尾的的文件,并返回一个文件列表数据
然后,通过open()函数打开文件,并利用read()函数把内容读到内存中,核心代码如下:
f = open("./log/"+file)
fileData = f.read()
2、正则匹配内容
采用python内置模块re正则,匹配模块,为了提高编码效率和减少代码的重复率,定义了一个匹配函数方法,核心代码如下:
def macth_res(rule,fileData):
"""
param: rule规则
param: fileData文件内容
return: list
扫描当前路径下的巡检日志
"""
compile_name = re.compile(rule, re.M)
res=compile_name.findall(fileData)
if len(res) != 0:
return res
return None
例如,想要从文本中获取cpu利用率,调用方法如下:
cpuUsage = macth_res("CPU Usage :(.*)",fileData)
以下是本案例获取的信息的核心代码:
def ReadFile():
files=scanFile("./log")
all_data=[]
for file in files:
host= file.split("_")[0]
data = {}
f = open("./log/"+file)
fileData = f.read()
uptime = macth_res("uptime is(.*)",fileData)
data["uptime"]=uptime[0]
verson = macth_res("Software Version : (.*)",fileData)
data['version'] =verson[0]
power = macth_res("POWER (.*)",fileData)
#提取电源状态信息
if power is not None:
for i,j in enumerate(power):
data["power"+str(i)]=j.strip().split(" ")[10]
cpuUsage = macth_res("CPU Usage :(.*)",fileData)
data["cpuUsage"] =cpuUsage[0]
fan = macth_res("Fan(.*)",fileData)
#提取风扇状态信息
if fan is not None:
for i,j in enumerate(fan):
data["fan"+str(i)]=j.strip().split(" ")[-1].replace(".","")
memoryUsingPer=macth_res("Memory Using Percentage Is:(.*)",fileData)
data["memoryUsingPer"]=memoryUsingPer[0]
all_data.append({host:data})
return all_data
3、格式化数据
为了后续把内容方便的写入到execl中,把数据的格式进行调整,做成一个List列表的形式。核心代码如下:
def formatData(data):
dataList=[]
for item in data:
for k,v in item.items():
for i,j in v.items():
dataList.append((maphostname(k),k,i,j))
return dataList
4、数据写入到execl中
python操作execl表格,有很多第三方的库,本案例采用xlwt,使用之前先执行下面的代码进行安装。
pip install xlwt
只要数据格式做好了,后面的写入execl都是很简单的,都是统一的模板。
def saveInfoToEexecl(data):
#创建一个工作簿workbook
workbook = xlwt.Workbook(encoding='utf-8')
partial_style = XFStyle()
borders = xlwt.Borders()
borders.left = 1
borders.right = 1
borders.top = 1
borders.bottom = 1
partial_style.borders = borders
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = 5
partial_style.pattern = pattern
al = xlwt.Alignment()
al.horz = 0x02
al.vert = 0x01
partial_style.alignment =al
# 创建一个sheet对象,第二个参数是指单元格是否允许重设置,默认为False
sheet = workbook.add_sheet('网络设备巡检', cell_overwrite_ok=True)
#设置表头
col_name = ("设备名称","管理地址", "检查项", "巡检结果")
for i in range(len(col_name)):
sheet.write(0,i,col_name[i],partial_style)
for i in range(len(data)):
In_data = data[i]
for j in range(len(col_name)):
if j == 0:
pass
sheet.write(i+1,j,In_data[j],)
workbook.save("text.xls")
保存的路径和文件名可以根据自己的实际情况进行调整,只需修改save()函数里面的参数即可
最终的效果
执行该脚本之后,会在当前目录生成一个test.xls表格,效果如下: