2015-06-22 1 views
-2

Я работаю над простым скриптом python для записи некоторых данных в два текстовых файла. Мой код выглядит так:Когда я пишу два файла в python, второй всегда пуст

with open('file1.txt', 'w') as file1: 
    for thing in stuff1: 
     file1.write(thing + '\n') 

with open('file2.txt', 'w') as file2: 
    for thing in stuff2: 
     file2.write(thing + '\n') 

Когда я запускаю программу, файл1 получается как ожидалось, но file2 пуст.

Однако, если я переключу порядок, в котором я пишу в файлы (это означает, что я пишу сначала в файл2, а затем в файл1), файл2 получается как ожидалось, а файл1 пуст.

Другими словами, файл, в который я пишу второй, всегда оказывается пустым.

Я попытался добавить file1.flush()/file2.flush() внутри циклов, но безрезультатно. Любая идея, почему это может произойти?

+4

что такое 'stuff1' и' stuff2'? Ваше письмо в файл кажется одобренным, если у них есть контент. –

+0

Вы изменили 'stuff1' и' stuff2'? – Kasramvd

+5

Отдел избыточности Redundancy хочет знать, почему вы пишете код дважды. Сделайте его функцией, которая принимает 'stuff' и' filename'. – jonrsharpe

ответ

4

Я угадываю здесь, но ваша проблема в том, что stuff1 и stuff2 указывают на тот же генератор или итератор, и вы можете только перебирать один раз. После этого его содержимое исчерпывается.

Попробуйте вместо этого:

import itertools 

stuff1, stuff2 = itertools.tee(the_source_generator_or_iterator_or_whatever) 

with open('file1.txt', 'w') as file1: 
    for thing in stuff1: 
     file1.write(thing + '\n') 

with open('file2.txt', 'w') as file2: 
    for thing in stuff2: 
     file2.write(thing + '\n') 
+0

Это сработало! Я не понимал, что итератор может быть «исчерпан», и я не смогу снова пропустить его. – Derek

+0

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

1

Я думаю, что у вас была линия

stuff2 = stuff1 

перед вашими фрагментами кода и stuff1, stuff2 являются генераторами. Если это так, они будут алиасами для одного и того же генератора. Первый цикл записи исчерпывает (одиночный) генератор.

+0

Это, по сути, ответ Рика, но только с предположением относительно источника псевдонима –

0

Я думаю, что stuff2 пуст. Вы можете распечатать переменную для отладки перед тем, как перейти во второй цикл for.