有谁知道如何阅读此表并解析为CSV文件或其他内容。 我需要将其转换为图形(如果可能)。
我真的很困惑如何阅读这个表,不像'show inventory'或'show version'那里有一个TextFSM模板来解析数据,'show proc cpu history'怎么样有TextFSM模板或什么?< / p>
答案 0 :(得分:0)
您需要读取文本文件并提取包含数值的每个图形上方的3行。这些需要“旋转”并转换为整数。
以下代码将读取文本文件并提取必要的行。它首先跳过所有初始行,直到找到三个图的标题行。
它旋转值(使用*zip(*data)
)。接下来,它根据源文件名将数据写入三个单独的CSV文件。
最后,它使用数据显示使用Python matplotlib
库(需要安装)的三个图形。
from itertools import dropwhile, takewhile, izip_longest
import matplotlib.pyplot as plt
import csv
import re
import os
from collections import deque
def process_block(block):
# Determine number of leading spaces (varies between files)
start_offset = min(len(block[0]) - len(block[0].lstrip()), len(block[1]) - len(block[1].lstrip()))
# Extract just data. Skip over leading spaces, remove trailing newline and replace any spaces with 0
block = [line[start_offset:].rstrip('\n').replace(' ', '0') for line in block]
# Convert to values
return [int(''.join(entry)) for entry in zip(*block)]
def process_switch_file(figure, switch_filename):
with open(switch_filename) as f_input:
# Extract just the graph lines
lines = list(takewhile(lambda x: "- show logging -" not in x, dropwhile(lambda x: "- show process cpu history -" not in x, f_input)))
headings = ["CPU% per second (last 60 seconds)", "CPU% per minute (last 60 minutes)", "CPU% per hour (last 72 hours)"]
# Keep reading each until a line starting 100 is found, keep the previous 2 lines
data = []
entry = iter(lines)
while True:
block = deque(takewhile(lambda x: not re.match(' *?100 ', x), entry), 2)
if len(block[0]) <= 1:
break
data.append(block)
data = [process_block(block) for block in data]
x_values = [range(0, len(block)) for block in data]
# Get the base filename (without path or extension)
csv_filename = os.path.splitext(os.path.basename(switch_filename))[0]
# Write data to a csv
with open('{}_cpu_seconds.csv'.format(csv_filename), 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['Second', 'Value'])
csv_output.writerows(list(zip(x_values[0], data[0])))
with open('{}_cpu_minutes.csv'.format(csv_filename), 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['Minute', 'Value'])
csv_output.writerows(list(zip(x_values[1], data[1])))
with open('{}_cpu_hours.csv'.format(csv_filename), 'wb') as f_output:
csv_output = csv.writer(f_output)
csv_output.writerow(['Hour', 'Value'])
csv_output.writerows(list(zip(x_values[2], data[2])))
fig = plt.figure(figure)
fig.canvas.set_window_title(csv_filename)
for subplot, x, block, heading in zip(range(311, 314), x_values, data, headings):
# Display as graphs
ax = fig.add_subplot(subplot)
ax.set_xlabel(heading)
ax.set_ylim(0, 100)
plt.plot(x, block)
plt.tight_layout()
for figure, filename in enumerate(['switch-2.txt', "switch-3.txt", "Switch.txt"], start=1):
process_switch_file(figure, filename)
plt.show()
CSV文件将启动如下:
Minute,Value
0,0
1,0
2,0
3,0
4,3
5,11
显示屏会显示:
matplotlib
通常可以使用以下方式安装:
pip install matplotlib