2012-04-18 2 views

ответ

6

Да, потому что .readlines() продвигает указатель файла в конец файла.

Почему бы просто не сохранить копию строк в переменной?

file_lines = file.readlines() 
Lines = list(file_lines) 
# do something that modifies Lines 
Lines = list(file_lines) 

Это будет намного эффективнее, чем ударить диск дважды. (Обратите внимание, что вызов list() необходимо создать копию списка, так что изменения Lines не повлияет file_lines.)

+1

Ваша техника здесь устанавливает 'Lines' в тот же объект Python, что и' file_lines'. Все, что мутирует одно, будет мутировать другое, поскольку они являются одним и тем же объектом. Чтобы быть в безопасности, вам нужно сделать 'lines = file_lines [:]' или каким-либо другим способом сделать фактическую копию. Кстати, стандарт PEP 8 предполагает использование нижнего регистра для имен переменных и резервирование смешанного случая для классов, поэтому я предлагаю изменить 'Lines' на просто' lines'. – steveha

+0

@steveha - Я уже добавил 'list()' звонки. Что касается имени переменной, я просто повторно использовал имя OP, чтобы упростить чтение. Я согласен с вами в том, что в нижнем регистре лучше. – Amber

+0

Приношу свои извинения. Я не уверен, как я пропустил оболочку 'list()', но я это сделал. Извини за это. – steveha

5

Вам нужно сбросить указатель файла с помощью

file.seek(0) 

перед использованием

file.readlines() 

еще раз.

+1

Или сохраните копию строк. – agf