Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 22, 2014 16:06:37

bs0d
Зарегистрирован: 2014-02-01
Сообщения: 76
Репутация: +  2  -
Профиль   Отправить e-mail  

Помогите с yield

Имеется директория, в которой лежит определенное кол-во файлов, содержимое которых - ссылки.
Необходимо получить содержимое этих файлов, и каждый раз при вызове функции возвращать список, содержащий по одной строке из каждого файла (первый вызов - вывод первых строк из всех файлов, второй вызов - вывод вторых строк и т.д.)
Кол-во строк в файлах - всегда одинаковое. Если доходим до конца файла (получаем StopIteration ?) - начинаем заново

def get_links():
    dir = 'links'
    dir_list = os.listdir(dir)
    links = []
    for x in dir_list:
        with open(os.path.join(dir, x)) as f:
            links.append(f.read().splitlines())
    for x in links:
        for y in links:
            yield (y)

    a = get_links()
    while 1:
        print(next(a))
Выводит только 5 раз
Понимаю, почему это происходит, но хз как решить. Как же правильно пользоваться yield? Или может кто предложит другой путь решения.

Офлайн

#2 Окт. 22, 2014 16:34:04

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Помогите с yield

bs0d
for x in links: for y in links:
Может надо
for x in links: 
    for y in x:
?



Офлайн

#3 Окт. 22, 2014 16:38:23

Isem
От:
Зарегистрирован: 2010-08-27
Сообщения: 447
Репутация: +  7  -
Профиль   Отправить e-mail  

Помогите с yield

Если убрать лишнее, то примерно получится:

def get_links():
    dir = 'links'
    dir_list = os.listdir(dir)
    for x in dir_list:
        with open(os.path.join(dir, x)) as f:
            yield from f.read().splitlines() 
print( *get_links() )



Офлайн

#4 Окт. 23, 2014 01:00:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9726
Репутация: +  842  -
Профиль   Отправить e-mail  

Помогите с yield

import itertools
 
def f(fnames):
    clst = []
    for i in fnames:
        clst.append(itertools.cycle(open(i, encoding='utf-8')))
    for i in zip(*clst):
        yield i
 
gen = f(('/etc/passwd', '/etc/fstab'))
for i in range(100):
    print(next(gen))



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version