2013-06-07 2 views
5

У меня есть файл "test.txt":ли объектный файл в Python итератора

this is 1st line 
this is 2nd line 
this is 3rd line 

следующий код

lines = open("test.txt", 'r') 
for line in lines: 
    print "loop 1:"+line 
for line in lines: 
    print "loop 2:"+line 

только печатает:

loop 1:this is 1st line 

loop 1:this is 2nd line 

loop 1:this is 3rd line 

Это Безразлично» t print loop2 вообще.

Два вопроса:

  1. файловый объект, возвращаемый открытым(), это итератор? поэтому его можно использовать в цикле for?

  2. Почему loop2 не печатается вообще?

ответ

24

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

+1

+1 для приятного, кратким описанием итеративной-итераторной вещи (в которой большинство других ответов даже не пытались, хотя это ключ к вопросу). – abarnert

+0

Спасибо за это описание. – martinbshp

1

Вы уже находитесь в конце файла. Файловые объекты являются итераторами. Как только вы перебираете их, вы находитесь на конечной позиции. Итерация снова не начнется с самого начала. Если вы хотите снова начать с линии один, вам нужно использовать lines.seek(0).

+0

Это неверное описание. 'list' также являются итерабельными, и все же вы можете повторять их снова без «поиска» или эквивалента. Проблема в том, что файловые объекты являются _iterators_ (а также являются итерабельными). – abarnert

+0

Typo. Я имел в виду итератора. Благодарю. Исправлена. –

2

Да, файловые объекты являются итераторами.

Как и все итераторы, вы можете их перекочевать только , после чего итератор исчерпан. Указатель чтения файла находится в конце файла. Повторно откройте файл или используйте .seek(0), чтобы перемотать указатель файла, если вам нужно снова зациклиться.

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

2

Да, объекты файлов являются итерабельными, но чтобы вернуться к началу файла, вам необходимо использовать lines.seek(0), так как после первого цикла вы находитесь в конце файла.

0

Было бы лучше, однако, переписать код, чтобы файл не нужно повторять дважды. Прочитайте все строки в каком-либо списке или выполните всю обработку в одном цикле.

 Смежные вопросы

  • Нет связанных вопросов^_^