2017-09-20 7 views
0

J'ai littéralement appris le concept de contourner les erreurs rencontrées dans les boucles for-loops. J'ai une liste de fichiers lus à partir de mon ordinateur local et je voudrais les lire en tant que données pandas. Disons que j'ai une liste de fichiers et chaque fichier en colonnes "A", "B" et "C". S'il y a une colonne spécifique, disons colonne "B" de fichier3.tbl, manquant dans un fichier sur mon ordinateur, je veux continuer avec ma boucle for.Python: Try, Continue, Exceptation dans la boucle for

list = ['file1.tbl', 'file2.tbl', 'file3.tbl'] 
for i in range(len(list)): 
    data = pandas.read_csv(list[i]) 
    try: 
     b = data['B'] 
     continue 
    except Exception: 
     print "Column B not included in file: ", list[i] 

Cela semble fonctionner un peu, mais elle imprime l'exception statment len ​​(liste) nombre de fois, comme ceci:

Column B not included in file: file3.tbl 
Column B not included in file: file3.tbl 
Column B not included in file: file3.tbl 

est-il un moyen de le faire pour imprimer une seule fois pour que itération spécifique?

+0

Voulez-vous dire 'la liste [i]' 'liste au lieu de [ii]'? De plus, l'indentation est désactivée sur votre bloc 'try'. –

+0

Oui, je le fais! Je vais éditer les deux. –

+5

Ne faites pas 'exception Exception'; Il a le potentiel de cacher un tas de choses que vous préférez savoir. 'excepté KeyError' serait plus spécifique. Aussi, êtes-vous sûr que c'est en fait votre code? Il est étrange que '.dat' soit imprimé lorsque votre liste contient seulement' .tbl'. – Ryan

Répondre

1

Comme indiqué dans les commentaires, vous avez probablement un problème d'espace de noms. Voici un code nettoyé qui devrait imprimer uniquement pour chaque Exception. Il comprend les suggestions Pythonic qui sont en accord avec les commentaires.

Pour trois fichiers comme csv "file1.tbl", "file2.tbl", "file3.tbl", je reçois le texte suivant:

import pandas as pd 


filenames = ["file1.tbl", "file2.tbl", "file3.tbl"]  # @John Gordon 
for fn in filenames: 
    data = pd.read_csv(fn) 
    try: 
     b = data['B'] 
    except (KeyError):          # @Ryan 
     print("Column B not included in file: ", fn) 
    else: 
     # Do something with b (optional) 
     pass 


# Column B not included in file: file1.tbl 
# Column B not included in file: file2.tbl 
# Column B not included in file: file3.tbl 
+0

Salut pylang, merci de bien résumer les suggestions. L'instruction else continuerait-elle la partie except de la logique ou reprendrait-elle l'endroit où l'instruction try s'était arrêtée? Ou commencerait-il au début de la boucle? –

+1

@DaxFeliz: L'instruction else ne sera exécutée que si aucune exception ne se produit. – Arun

+1

Il continue à partir du bloc 'try' en l'absence d'exception, comme mentionné dans @Arun. – pylang