Python - почему я не могу получить надиктующие предметы в генераторе? - PullRequest
0 голосов
/ 06 декабря 2018

Я создал генератор, который читает каждую строку из большого файла CSV и возвращает каждую строку:

def csv_reader(filename):
    import csv
    with open(filename) as f:
        reader = csv.DictReader(f)
        for line in reader:
            yield  dict(line)


filename = "output.csv"
generator = csv_reader(filename)

Я знаю, как выполнить итерацию генератора и получить вывод:

# Iterate Generator
for g in generator:
    print(g)

Это печатает словари.

Однако как мне получить доступ к значению каждого ключа в каждом словаре?Следующее ничего не вернуло.

for g in generator:
    print(g['user'])

Это также не будет работать:

>>> for g in generator:
...     alist.append(g.keys())
...     alist
... 
>>> alist
[]

1 Ответ

0 голосов
/ 06 декабря 2018

Похоже, вы итерируете теперь пустой генератор.

Я имею в виду, что после того, как вы один раз итерировали свой генератор, он опустошается, и повторение его снова ничего не даст:

>>> def some_generator():
...     yield 1
...     yield 2
...     yield 3
... 
>>> generator = some_generator()
>>> for g in generator:
...     print(g)
... 
1
2
3
>>> for g in generator:
...     print(g)
... 

Есть два пути вокруг этого: либо сохранить результат генератора в списке, чтобы вы могли повторять список несколько раз (потребляет память), либо воссоздать генератор (использует ввод-вывод при чтении файла).

То есть:

>>> for g in some_generator():
...     print(g)
... 
1
2
3
>>> for g in some_generator():
...     print(g)
... 
1
2
3

или:

>>> values = list(some_generator())
>>> for g in values:
...     print(g)
... 
1
2
3
>>> for g in values:
...     print(g)
... 
1
2
3
...