我写了一个脚本,将Cisco交换机数据输出到.txt文件。我想解析这些文件,以便仅使用Python从它们中提取所需的信息。下面是文本文件中数据的示例:
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Gi0/3, Gi1/0, Gi1/1, Gi1/2, Gi1/3, Gi2/1, Gi2/2, Gi2/3
95 MGMT-VLAN95 active Gi0/2
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup p
1005 trnet-default act/unsup
由于我对Python的了解有限,因此我尝试通过执行以下操作来实现这一目标,但我没有设法实现我希望的目标:
with open('newfile', 'rw') as newfile:
list = newfile.readlines()
for row in list:
x = (row.strip().split())
print(x)
['VLAN', 'Name', 'Status', 'Ports']
['----', '--------------------------------', '---------', '-------------------------------']
['1', 'default', 'active', 'Gi0/3,', 'Gi1/0,', 'Gi1/1,', 'Gi1/2,', 'Gi1/3,', 'Gi2/0,', 'Gi2/1,', 'Gi2/2,', 'Gi2/3,', 'Gi3/0,', 'Gi3/1,', 'Gi3/2,', 'Gi3/3']
['95', 'MGMT-VLAN95', 'active', 'Gi0/2']
['1002', 'fddi-default', 'act/unsup']
['1003', 'token-ring-default', 'act/unsup']
['1004', 'fddinet-default', 'act/unsup']
['1005', 'trnet-default', 'act/unsup', 'p']
['1005', 'trnet-default', 'act/unsup']
以下是我希望得到的输出:
VLAN Name
---- --------------------------------
1 default
95 VLAN-MGMT95
200 VLAN200
1002 fddi-default
1003 token-ring-default
1004 fddinet-default
1005 trnet-default
答案 0 :(得分:1)
如果只希望前两列,请执行以下操作:
with open('newfile', 'rw') as nf:
mylist = nf.readlines()
for row in mylist:
mydata = row[0] + " " + row[1]
print mydata
(请注意,我更改了变量,因为“列表”是Python关键字)。
答案 1 :(得分:1)
不确定您的回溯是什么,但我建议使用以下内容:
with open('newfile', 'rw') as newfile:
lines = newfile.readlines()
for row in lines:
x = row.strip().split()
if len(x) >= 2:
print(x[0].ljust(4) + ' ' + x[1])
这将避免出现格式错误的行可能引起的问题,从而导致弹出IndexError
异常。此外,ljust(4)
通过在VLAN列中的字符串左对齐四个空格,使输出的格式更好。
答案 2 :(得分:0)
您可以这样做:
with open('data.txt') as f:
lines = [line.strip() for line in f.readlines()]
lines_to_lists = [line.split() for line in lines if line]
content = list(zip(*lines_to_lists))
这样,文件中的每一列都将转到content
列表中的特定位置(索引)。因此,如果要打印VLAN,只需键入:
print(content[0])
如果要打印您的VLANS名称:
print(content[1])
对于两者:
for vlan, name in zip(content[0], content[1]):
print(vlan, name)
答案 3 :(得分:0)
您可以使用TTP来解析以上文本,这是代码:
from ttp import ttp
data = """
VLAN Name Status Ports
---- -------------------------------- --------- -------------------------------
1 default active Gi0/3, Gi1/0, Gi1/1, Gi1/2, Gi1/3, Gi2/1, Gi2/2, Gi2/3
95 MGMT-VLAN95 active Gi0/2
1002 fddi-default act/unsup
1003 token-ring-default act/unsup
1004 fddinet-default act/unsup
1005 trnet-default act/unsup
1005 trnet-default act/unsup
"""
template = """
<group method="table">
{{ VLAN | DIGIT }} {{ name }} {{ ignore }} {{ ignore(ORPHRASE) }}
{{ VLAN | DIGIT }} {{ name }} {{ ignore }}
</group>
<output format="tabulate" headers="VLAN,name"/>
"""
parser = ttp(data, template)
parser.parse()
print(parser.result()[0])
将打印:
VLAN name
------ ------------------
1 default
95 MGMT-VLAN95
1002 fddi-default
1003 token-ring-default
1004 fddinet-default
1005 trnet-default
1005 trnet-default
答案 4 :(得分:-1)
with open('newfile', 'r') as newfile:
list = newfile.readlines()
for row in list:
x = (row.strip().split())
y = x[0:2]
print(', '.join(y))