2017-10-16 3 views
-2

comment puis-je obtenir mon impression d'autre pour imprimer seulement une fois au lieu de pour chaque ligne que la chaîne n'existe pas? J'ai essayé de le déplacer en tabulant quelques couches mais cela ne fonctionne pas. Je comprends la logique, mais je ne sais pas comment la limiter. J'ajoute un peu à la fois à mes scripts de parsing pour la pratique, j'apprends comme je pars, mais celui-ci m'a eu. Merci!Imprimer autre qu'une seule fois?

import csv 
# Testing finding something specifical in a CSV, with and else 
testpath = 'C:\Users\Devin\Downloads\users.csv' 
developer = "devin" 

with open (testpath, 'r') as testf: 
    testr = csv.reader(testf) 
    for row in testr: 
     for field in row: 
      if developer in row: 
       print row 
     else: 
      print developer + " does not exist!" 
+0

Cela devrait-il être 'si développeur dans le champ:' dans votre code? (pas dans la rangée: ')? –

Répondre

5

En Python, vous pouvez avoir une else clause jointe à votre boucle for. Par exemple

>>> for i in range(10): 
...  if i == 5: break # this causes the else statement to be skipped 
... else: 
...  print 'not found' 
... 

Remarque 5 a été trouvé si l'instruction else est pas exécuté

>>> for i in range(10): 
...  if i == 15: break 
... else: 
...  print 'not found' 
... 
not found 

Voir la documentation on for statements

Une instruction break exécutée dans la première suite se termine la boucle sans exécuter la suite de la clause else. Une instruction continue exécutée dans la première suite ignore le reste de la suite et continue avec l'élément suivant, ou avec la clause else s'il n'y a pas d'élément suivant.

+2

Quelle information précieuse. Je n'ai jamais su ça! – Unni

+0

Raymond Hettinger a suggéré le mot-clé «nobreak» pour être présenté, mais la proposition n'a jamais passé ... plus [ici] (https://www.youtube.com/watch?v=OSGv2VnC0go#t=17m12s) – mentalita

+0

@mentalita merci pour le lien. Je suis d'accord que c'est un peu confus dans sa mise en œuvre actuelle –

3

Voir la réponse de Gibson en premier. Vous pouvez le faire:

for row in testr: 
    found = False 
    for field in row: 
     if developer in row: 
      print row 
      found = True 
      break 
    if found: break 
else: 
    print developer + " does not exist!" 

Vous pouvez également omettre le drapeau found (comme suggéré par Jean-François Fabre dans le commentaire), mais ce qui rend un peu difficile à comprendre imo (je devais compiler dans ma tête):

for row in testr:  
    for field in row: 
     if developer in row: 
      print row 
      # We found the developer. break from the inner loop. 
      break 
    else: 
     # This means, the inner loop ran fully, developer was not found. 
     # But, we have other rows; we need to find more. 
     continue 
    # This means, the else part of the inner loop did not execute. 
    # And that indicates, developer was found. break from the outer loop. 
    break 
else: 
    # The outer loop ran fully and was not broken 
    # This means, developer was not found. 
    print developer, "does not exist!" 
+0

le drapeau 'found' n'est pas utile. Vous pourriez aussi utiliser le tour 'else' dans la boucle interne. –

+0

True. Réponse mise à jour Merci. – mshsayem