Печать всех результатов из генератора Python - PullRequest
0 голосов
/ 01 января 2019

Я сделал функцию генератора, которая ищет файл CSV, используя ключевое слово, и я хочу напечатать результаты, если что-то есть.Как я могу сделать это, не используя print (next (gen_results)) снова и снова?

Я пробовал оператор try-catch для stopIteration, когда нет совпадения ключевого слова с контактом, но яЯ хочу получить более краткое решение.

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

Я ожидаю, что результатом будет оператор «Ничего не найдено», если нет контактов с ключевым словом.Если есть контакты с ключевым словом, он выводит все списки.

Ответы [ 4 ]

0 голосов
/ 01 января 2019

Вы можете поставить тест «not found» в самом генераторе:

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

В противном случае я думаю, что самое простое - это list генератор и проверка на пустой список.Сам по себе механизм генератора не считает количество yields.

0 голосов
/ 01 января 2019

Пожалуйста, попробуйте это

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)

'the_generator' является итеративным объектом, а циклу 'for' для запуска необходим итеративный объект.Вывод программы будет:

Nothing Found
Nothing Found
Nothing Found
Nothing Found
Nothing Found
Python, 100 
0 голосов
/ 01 января 2019

Есть несколько способов использовать генератор - unsing next() использует только его (следующее) значение.

Создать файл:

def gen_file():
    with open("contacts.csv","w") as f:
        f.write("""Name01, 89888
Name02, 8885445
Name03, 54555
Name04, 55544584
Name05, 55855
Python, 100
BigPi, 444
Python, 101
""")

Использовать его:

gen_file()   

def search(keyword, filename="contacts.csv"):
    """Changed to use .. with open() as f: ... style syntax."""
    with open(filename, 'r') as f:
        for line in f:
            if keyword in line:
                yield line 


# consume all of it into a list - you can reuse it
print("-"*40)
the_generator = search('Python', 'contacts.csv')
contacts = list(the_generator)
print(*contacts, sep="")


print("-"*40)
# decompose the generator directly for printing
the_generator = search('Python', 'contacts.csv')
print(*the_generator, sep="" ) 


print("-"*40)
# 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


print("-"*40)
# using str.join to create the output
the_generator = search('Python', 'contacts.csv')
print("".join(the_generator))


print("-"*40)
# loop endlessly until StopIteration is raised
try:
    while True:
        print(next(the_generator), end="")
except StopIteration:
    pass

и т. Д.

Вывод (несколько раз):

----------------------------------------
Python, 100
Python, 101

«Лучшим», если вы не используете сгенерированные значения, является, вероятно, print(*the_generator,sep="") или более явное:

# 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

Вы также можете прочитать здесь: Использование yield from с условным в python

0 голосов
/ 01 января 2019
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())
...