2
votes

Extraire uniquement les colonnes souhaitées d'un fichier txt en utilisant Python?

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']
  • Print (x) renvoie la sortie ci-dessous, mais lorsque j'essaie d'utiliser l'indexation et d'appeler print (x [1]), je reçois un message d'erreur Traceback sur cette ligne.
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


1 commentaires

Quelle erreur obtenez-vous et sur quelle ligne?


5 Réponses :


1
votes

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).


1 commentaires

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.



1
votes

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.


0 commentaires

0
votes

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))


0 commentaires

-1
votes
with open('newfile', 'r') as newfile:
    list = newfile.readlines()
    for row in list:
        x = (row.strip().split())
        y = x[0:2]
        print(', '.join(y))

1 commentaires

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.



0
votes

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


0 commentaires