Запись списка Python в файл CSV очищает список

Я делаю несколько тестов со списками, методом enumerate() и файлами CSV.

Я использую метод writerows() для сохранения перечисляемого объекта в файл .csv. Все работает нормально, но объект list/enumerate становится пустым после завершения записи.

Почему это происходит ? Как я могу сохранить значения в своем списке (должен ли я сохранять их в другой переменной)?

Я использую Windows 10, используя Python 3.6.4.

Вот мой код:

import csv

b = [1,2,3,4,5,6,7,8,9,10,11,"lol","hello"]
c = enumerate(b)

with open("output.csv", "w", newline='') as myFile:
    print("Writing CSV")
    writer = csv.writer(myFile)
    writer.writerows(c)

print(list(c))

выход:

>>>Writing CSV
>>>[]
>>>[Finished in 0.1s

Если я преформирую: print(list(c)) перед методом записи, c тоже станет пустым.

Спасибо!


person yurikleb    schedule 19.03.2018    source источник
comment
какой-либо из ответов работал на вас. Вы можете принять полезный ответ.   -  person Rahul    schedule 20.03.2018


Ответы (3)


c = enumerate(b)

Здесь c — это не list, а генератор, который потребляется, когда вы перебираете его.

Вам придется создавать новый генератор каждый раз, когда вы его используете.

Если вам нужна постоянная ссылка на исчерпанное содержимое генератора, вы должны преобразовать его в list.

c = list(enumerate(b))
person Rahul    schedule 19.03.2018

Это совершенно нормально. c — это генератор, который будет перебирать все элементы b, поэтому он будет перебирать b только один раз. Это когда вы звоните writer.writerows(c).

После этого генератор истощается, поэтому создание из него list вернет пустой список.

person Guillaume    schedule 19.03.2018
comment
c потребляется не потому, что это итератор, а потому что это генератор. - person Rahul; 19.03.2018
comment
@Rahul: правда, исправлено - person Guillaume; 19.03.2018

[Python]: enumerate(итерируемый, start=0) возвращает генератор.

Из [Python]: Генераторы:

Повышение производительности за счет использования генераторов является результатом ленивой (по запросу) генерации значений, что приводит к меньшему использованию памяти. Кроме того, нам не нужно ждать, пока все элементы будут сгенерированы, прежде чем мы начнем их использовать. Это похоже на преимущества, предоставляемые итераторами, но генератор упрощает создание итераторов.
...
Примечание. Генератор обеспечит преимущества в производительности, только если мы не собираемся использовать этот набор сгенерированных значений больше, чем однажды.

Значения генератора потребляются после его итерации. Вот почему вы должны «сохранить» его, например. преобразование его в список (который также будет потреблять его, поскольку он будет перебирать его).

Для получения более подробной информации вы также можете проверить [SO ]: Как вывести список всех файлов каталога? Ответ (@CristiFati, часть первая) (раздел Предварительные примечания, где я иллюстрирую поведение [Python]: map(функция, повторяемая, ...)).

person CristiFati    schedule 19.03.2018