1
votes

Impression de tous les résultats à partir d'un générateur Python

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.


3 commentaires

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


4 Réponses :


1
votes
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())

3 commentaires

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



2
votes

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)


1 commentaires

Cela produit «Rien trouvé» par ligne, pas par fichier.



0
votes

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


0 commentaires

1
votes

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 .


0 commentaires