J'ai créé une fonction de générateur qui recherche un fichier csv en utilisant un mot-clé et je veux imprimer les résultats s'il y a quelque chose. Comment puis-je faire cela sans utiliser le print (next (gen_results)) encore et encore?
J'ai essayé une instruction try-catch pour stopIteration, quand il n'y a pas de correspondance du mot-clé avec un contact mais que je veux un plus solution concise.
def search(keyword, filename): f = open(filename, 'r') for line in f: if keyword in line: yield line f.close() the_generator = search('Python', 'contacts.csv') print(next(the_generator)) print(next(the_generator)) contacts.csv Name01, 89888 Name02, 8885445 Name03, 54555 Name04, 55544584 Name05, 55855 Python, 100 BigPi, 444 Python, 101
Je m'attends à ce que la sortie soit une déclaration comme «Rien trouvé», s'il n'y a aucun contact avec le mot-clé. S'il y a des contacts avec le mot-clé, il affiche toutes les listes.
4 Réponses :
def search(keyword, filename): f = open(filename, 'r') for line in f: if keyword in line: yield line f.close() the_generator = search('Python', 'contacts.csv') my_list=list(the_generator) if not my_list: print("Not Found") for item in my_list: print(item.strip())
@DavisHerring J'ai pensé que ce serait une méthode simple pour l'enregistrer dans une liste et vérifier si elle est vide pour imprimer "Rien trouvé" une fois si la liste était vide
Bien sûr, maintenant ça l'est. (J'avais commenté la version originale.)
@DavisHerring Désolé. J'ai répondu ce que j'avais et j'essayais le reste de mon système.
Veuillez essayer ceci
Nothing Found Nothing Found Nothing Found Nothing Found Nothing Found Python, 100
'the_generator' est un objet iterate et la boucle 'for' a besoin d'un objet iterate pour s'exécuter. La sortie du programme sera:
def search(keyword, filename): f = open(filename, 'r') for line in f: if keyword in line: yield line else: yield 'Nothing Found' f.close() the_generator = search('Python', 'contacts.csv') for g in the_generator: print(g)
Cela produit «Rien trouvé» par ligne, pas par fichier.
Il existe plusieurs méthodes pour consommer le générateur - unsing next ()
n'en consomme que la valeur (suivante).
Générer le fichier:
# use a for loop over the generated results the_generator = search('Python', 'contacts.csv') for li in the_generator: print(li,end="") # remove end=\n
Vous pouvez mettre le test "non trouvé" dans le générateur lui-même:
def search(keyword, lines): cnt = 0 for line in lines: if keyword in line: cnt += 1 yield line if cnt==0: yield "NOT FOUND" In [166]: txt = """Name01, 89888 ...: Name02, 8885445 ...: Name03, 54555 ...: Name04, 55544584 ...: Name05, 55855 ...: Python, 100 ...: BigPi, 444 ...: Python, 101 ...: """.splitlines() In [167]: for x in search("Python",txt):print(x) Python, 100 Python, 101 In [168]: for x in search("Foobar",txt):print(x) NOT FOUND
Sinon, je pense que le plus simple est de lister
le générateur, et de vérifier un liste vide. À lui seul, le mécanisme du générateur ne compte pas le nombre de rendements
.
pour les boucles? liste décomposer?
print (* the_generator, sep = "\ n")
@DavisHerring dans ce cas .. plus une décomposition de générateur puis une décomposition de liste. Voir stackoverflow.com/questions/6319612/python-decompose-a-list - certainement pas une compréhension de liste.
@PatrickArtner: OK, cela semble s'appeler "déballage" , mais je pourrais dire «expansion» pour éviter la confusion avec
a, b = f ()
(que j'appelle parfois à mon tour «décomposition»).