2

我正在使用 Python 3。我编写了两个程序。一个循环遍历 csv 文件以获取 Cisco 交换机的 IP 地址、登录、运行命令,然后将每个结果的结果输出到单独的文本文件。所以我最终得到了一些文本文件......每个开关一个。第二个程序使用 xlwt 将每个文本文件中的信息写入 Excel 中自己的工作表。

主要想法是我需要开发一份报告,显示端口进出服务。一旦我将这些导入 Excel,我就可以编写一些公式来提取我需要的数据。但就目前而言,当我将其导入 Excel 时,我必须手动删除一些单元格,因为所有内容都没有对齐,这是因为名称列中的某些单词之间存在空格(我正在导入 Excel以空格分隔)。我试图用字符串和列表方法(拆分、连接、切片等)做一些事情,但我无法得到我想要的。并且 Name 列在任何一种一致的约定中都没有标准化。我确实注意到虽然名称实际上可能很长,但它会被截断为一定数量的字符。

理想情况下,首先删除前 4 行(最顶部有空白行)和最后一行,然后对于 Port 和 Status 之间的任何内容,将其全部删除(完全删除该列,包括标题)。

这是从交换机获取数据后文件的外观。

sw1#term 长度 0
sw1#显示接口状态

端口名称 状态 Vlan 双工速度类型
Gi0/1 Trunk to switch (a connected 1 a-full a-100 10/100/1000BaseTX
Gi0/2 网络增强 pe 已连接 1 a-full a-1000 10/100/1000BaseTX
Gi0/3 已连接 1 a-full a-1000 10/100/1000BaseTX
Gi0/4 已连接 1 a-full a-100 10/100/1000BaseTX
Gi0/5 notconnect 1 auto auto 不存在
Gi0/6 未连接 1 自动 自动 不存在
Gi0/7 未连接 1 自动 自动 不存在
Gi0/8 未连接 1 自动 自动 不存在
Gi0/9 未连接 1 自动 自动 不存在
Gi0/10 已连接 1 a-full a-100 10/100/1000BaseTX
Gi0/11 notconnect 1 auto auto 不存在
Gi0/12 已连接 1 a-full a-100 10/100/1000BaseTX
Gi0/13 禁用 1 自动 自动 不存在
Gi0/14 禁用 1 自动 自动 不存在
Gi0/15 禁用 1 自动 自动 不存在
Gi0/16 禁用 1 自动 自动 不存在
sw1#注销

最终结果我想在下面。这应该允许行/列结构在导入 Excel 时保持不变。请注意,所有列信息都用空格分隔。我发现导入为固定宽度或以空格分隔,并将连续空格视为一个检查似乎工作得很好。

端口状态 Vlan 双工速度类型
Gi0/1 已连接 1 a-full a-100 10/100/1000BaseTX
Gi0/2 已连接 1 a-full a-1000 10/100/1000BaseTX
Gi0/3 已连接 1 a-full a-1000 10/100/1000BaseTX
Gi0/4 已连接 1 a-full a-100 10/100/1000BaseTX
Gi0/5 notconnect 1 auto auto 不存在
Gi0/6 未连接 1 自动 自动 不存在
Gi0/7 未连接 1 自动 自动 不存在
Gi0/8 未连接 1 自动 自动 不存在
Gi0/9 未连接 1 自动 自动 不存在
Gi0/10 已连接 1 a-full a-100 10/100/1000BaseTX
Gi0/11 notconnect 1 auto auto 不存在
Gi0/12 已连接 1 a-full a-100 10/100/1000BaseTX
Gi0/13 禁用 1 自动 自动 不存在
Gi0/14 禁用 1 自动 自动 不存在
Gi0/15 禁用 1 自动 自动 不存在
Gi0/16 禁用 1 自动 自动 不存在

任何指针将不胜感激。我在想正则表达式可能是有序的,但我需要一些帮助来构建它。我希望这不是太模棱两可。

删除了以前的更新并将其移至新线程

4

4 回答 4

1

首先,下面的代码删除了名称列。从那里取出并添加一个漂亮的 csv 打印输出。提示:column[-1]是最后一个条目,column[-2]倒数第二个。如果字符串Not存在,则加入这些...

#!/usr/bin/env python

tokens = ['connected', 'notconnect', 'disabled']

with open('text') as fd:
    for line in fd:
        line = line.strip().split()

        connection = [line[0]]
        found = False

        for i in line:
            if i in tokens:
                found = True
            if found:
                connection.append(i)

        print connection

输出:

['Gi0/1', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/2', 'connected', '1', 'a-full', 'a-1000', '10/100/1000BaseTX']
['Gi0/3', 'connected', '1', 'a-full', 'a-1000', '10/100/1000BaseTX']
['Gi0/4', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/5', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/6', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/7', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/8', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/9', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/10', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/11', 'notconnect', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/12', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/13', 'disabled', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/14', 'disabled', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/15', 'disabled', '1', 'auto', 'auto', 'Not', 'Present']
['Gi0/16', 'disabled', '1', 'auto', 'auto', 'Not', 'Present']

评论后更新:

这就是我使用KISS 原则的方法:

#!/usr/bin/env python

import sys

tokens = ['connected', 'notconnect', 'disabled']

with open('text') as fd:
    for line in fd:
        line = line.strip().split()

        connection = [line[0]]
        found = False

        for i in line:
            if i in tokens:
                found = True
            if found:
                connection.append(i)

        if 'Not' in connection and 'Present' in connection:
            # Remove last 2 entries
            connection.pop() ; connection.pop()
            connection.append('Not Present')

        print connection

输出:

['Gi0/1', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/2', 'connected', '1', 'a-full', 'a-1000', '10/100/1000BaseTX']
['Gi0/3', 'connected', '1', 'a-full', 'a-1000', '10/100/1000BaseTX']
['Gi0/4', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/5', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/6', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/7', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/8', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/9', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/10', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/11', 'notconnect', '1', 'auto', 'auto', 'Not Present']
['Gi0/12', 'connected', '1', 'a-full', 'a-100', '10/100/1000BaseTX']
['Gi0/13', 'disabled', '1', 'auto', 'auto', 'Not Present']
['Gi0/14', 'disabled', '1', 'auto', 'auto', 'Not Present']
['Gi0/15', 'disabled', '1', 'auto', 'auto', 'Not Present']
['Gi0/16', 'disabled', '1', 'auto', 'auto', 'Not Present']
于 2012-05-12T21:41:03.377 回答
1
with open('file') as f:
    lines = f.readlines()
    lines = lines[-1:] + lines[2:-1]
    for line in lines:
        print line[0:11] + line[35:-1]

我认为这将大致满足您的要求;你可能需要玩一些数字,因为我自己没有运行它。它使用的只是列表(或字符串)索引:

  • list[x:] 是从 x 开始的所有条目
  • list[x:y] 是从 x 到 y 的所有条目
  • list[-x] 是从末尾算起的第 x 行

lines[-1:] + lines[2:-1]最后一行放在第一位,并丢弃前两行;line[0:11] + line[35:-1]不包括您不想要的部分和最后的换行符。

如果要写入新文件而不是标准输出,请更新:

with open('infile') as in:
    with open('outfile', 'w') as out:
        lines = in.readlines()
        ...
            print(line[0:6] + line[28:-1], file=out)

事实上,由于 readlines 一次读取所有内容,您可以这样做:

with open('infile') as in:
    lines = in.readlines()
with open('outfile', 'w') as out:
    for line in lines:
        ....
        print(line[0:6] + line[28:-1], file=out)

因为不需要打开输入文件(with完成后关闭)。

于 2012-05-12T21:44:37.367 回答
1

我跳过了前 3 行:

sw1#term length 0
sw1#show interfaces status

程序:

with open('in.txt') as f,open('out.txt','w') as out:
   line1=f.readline()
   ind1=line1.find('Name')
   ind2=line1.find('Status')
   x=line1.split()
   x.remove('Name')
   y="%-13s %-15s %-6s %-7s %-8s %-s"%(x[0],x[1],x[2],x[3],x[4],x[5])
   out.write(y+'\n')
   for x in f:
       x=x[:ind1]+x[ind2:]
       x=x.split()
       y="%-13s %-15s %-6s %-7s %-8s %-s"%(x[0],x[1],x[2],x[3],x[4],x[5])
       out.write(y+'\n')


Port          Status          Vlan   Duplex  Speed    Type
Gi0/1         connected       1      a-full  a-100    10/100/1000BaseTX
Gi0/2         connected       1      a-full  a-1000   10/100/1000BaseTX
Gi0/3         connected       1      a-full  a-1000   10/100/1000BaseTX
Gi0/4         connected       1      a-full  a-100    10/100/1000BaseTX
Gi0/5         notconnect      1      auto    auto     Not
Gi0/6         notconnect      1      auto    auto     Not
Gi0/7         notconnect      1      auto    auto     Not
Gi0/8         notconnect      1      auto    auto     Not
Gi0/9         notconnect      1      auto    auto     Not
Gi0/10        connected       1      a-full  a-100    10/100/1000BaseTX
Gi0/11        notconnect      1      auto    auto     Not
Gi0/12        connected       1      a-full  a-100    10/100/1000BaseTX
Gi0/13        disabled        1      auto    auto     Not
Gi0/14        disabled        1      auto    auto     Not
Gi0/15        disabled        1      auto    auto     Not
Gi0/16        disabled        1      auto    auto     Not
于 2012-05-12T22:04:37.240 回答
0

让我们只取第一个和最后 5 个值,如果类型不存在,则进行一点大小写切换:

print "{:10} {:15} {:5} {:6} {:6} {}".format("port", "status", "vlan", "duplex", "speed", "type")
with open(my_filename) as logfile:
    content = logfile.read()
    for line in content.splitlines()[4:]:
        port = line.split()[0]
        if line.strip().endswith("Not Present"):
            itype = "Not Present"
            status, vlan, duplex, speed = line.split()[-6:-2]
        else:
            status, vlan, duplex, speed, itype = line.split()[-5:]
        print "{:10} {:15} {:5} {:6} {:6} {}".format(port, status, vlan, duplex, speed, itype)

产量:

port       status          vlan  duplex speed  type            
Gi0/1      connected       1     a-full a-100  10/100/1000BaseTX
Gi0/2      connected       1     a-full a-1000 10/100/1000BaseTX
Gi0/3      connected       1     a-full a-1000 10/100/1000BaseTX
Gi0/4      connected       1     a-full a-100  10/100/1000BaseTX
Gi0/5      notconnect      1     auto   auto   Not Present
Gi0/6      notconnect      1     auto   auto   Not Present
Gi0/7      notconnect      1     auto   auto   Not Present
Gi0/8      notconnect      1     auto   auto   Not Present
Gi0/9      notconnect      1     auto   auto   Not Present
Gi0/10     connected       1     a-full a-100  10/100/1000BaseTX
Gi0/11     notconnect      1     auto   auto   Not Present
Gi0/12     connected       1     a-full a-100  10/100/1000BaseTX
Gi0/13     disabled        1     auto   auto   Not Present
Gi0/14     disabled        1     auto   auto   Not Present
Gi0/15     disabled        1     auto   auto   Not Present
Gi0/16     disabled        1     auto   auto   Not Present
于 2012-05-12T21:42:18.443 回答