J'ai écrit un script qui renvoie les données de commutateur Cisco dans un fichier .txt. Je souhaite analyser ces fichiers pour en extraire uniquement les informations dont j'ai besoin en utilisant Python. Voici un exemple de données dans le fichier texte:
VLAN Name ---- -------------------------------- 1 default 95 VLAN-MGMT95 200 VLAN200 1002 fddi-default 1003 token-ring-default 1004 fddinet-default 1005 trnet-default
Avec ma connaissance limitée de Python, j'ai essayé d'y parvenir en faisant ce qui suit mais je n'arrive pas à réaliser ce que je souhaite:
['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']
with open('newfile', 'rw') as newfile:
list = newfile.readlines()
for row in list:
x = (row.strip().split())
print(x)
Voici le résultat que j'espère:
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
5 Réponses :
Si vous voulez juste les deux premières colonnes, faites ceci:
with open('newfile', 'rw') as nf:
mylist = nf.readlines()
for row in mylist:
mydata = row[0] + " " + row[1]
print mydata
(notez que j'ai changé votre variable car "list" est un mot-clé Python).
Cela a renvoyé une IndexError, mais cela fonctionne lorsqu'il est combiné avec le correctif de SpencerD pour résoudre l'IndexError. Merci Mike! Merci également d'avoir signalé la mauvaise pratique d'utilisation de list comme nom de variable, notée pour l'avenir.
Je ne sais pas quel est votre traceback, mais je recommanderais d'utiliser ce qui suit:
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])
Cela évitera d'éventuels problèmes avec des lignes mal formées provoquant des exceptions IndexError de popping- vers le haut. De plus, ljust (4) donne à la sortie une mise en forme plus agréable en justifiant à gauche la chaîne dans la colonne VLAN avec quatre espaces.
Vous pouvez le faire comme ceci:
for vlan, name in zip(content[0], content[1]):
print(vlan, name)
De cette façon, chaque colonne de votre fichier va à un endroit particulier (index) dans une liste de contenu . Donc, si vous souhaitez imprimer vos VLANS, tapez simplement:
print(content[1])
Si vous souhaitez imprimer vos noms de VLANS:
print(content[0])
Pour les deux:
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))
with open('newfile', 'r') as newfile:
list = newfile.readlines()
for row in list:
x = (row.strip().split())
y = x[0:2]
print(', '.join(y))
Ce n'est pas une bonne pratique d'attribuer quelque chose au nom "liste" en Python, car cela écraserait la fonction intégrée list . Veuillez également ajouter quelques explications à vos réponses.
Vous pouvez utiliser TTP pour analyser le texte ci-dessus, voici le code:
VLAN name
------ ------------------
1 default
95 MGMT-VLAN95
1002 fddi-default
1003 token-ring-default
1004 fddinet-default
1005 trnet-default
1005 trnet-default
Quelle erreur obtenez-vous et sur quelle ligne?