0

有谁知道如何读取此表并解析为 CSV 文件或其他内容。我需要将其转换为图形(如果可能)。

我真的很困惑如何阅读这张表,不像“显示库存”或“显示版本”有一个 TextFSM 模板来解析数据,“显示 proc cpu 历史记录”有 TextFSM 模板或任何东西怎么样?

显示 proc cpu 历史(来自 show tech.txt) 在此处输入图像描述

4

1 回答 1

0

您需要读取文本文件并提取每个包含数值的图形上方的 3 行。这些需要“旋转”并转换为整数。

以下代码将读取文本文件并提取必要的行。它首先跳过所有初始行,直到找到三个图表的标题行。

它旋转值(使用*zip(*data))。接下来,它根据源文件名将数据写入三个单独的 CSV 文件。

最后,它使用 Pythonmatplotlib库(需要安装)使用数据显示三个图形。

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 图

matplotlib通常可以使用以下方式安装:

pip install matplotlib
于 2017-05-18T11:36:55.400 回答