2015-05-05 4 views
1

Я не совсем понимаю, как Python перебирает список и файл.Looping schema in Python

Допустим, у меня есть файл, который выглядит следующим образом:

textfile:

Stations 
-------- 
stn  Name         Parameter  Data source        Longitude/Latitude  Coordinates [km] Elevation [m] 
ARA  Arolla        rre250c0   XX             XXX    XXX    0 
BOQ  Bouquetins       rre250c0   XX             XXX    XXX    0 
BRE  Bréona        rre250c0   XX             XXX    XXX    0 
CDR  Col de Riedmatten     rre250c0   XX             XXX    XXX    0  
CTZ  Crettaz        rre250c0   XX             XXX    XXX    0           
HOL  Hohlicht        rre250c0   XX             XXX    XXX    0   
TRI  Trift        rre250c0   XX             XXX    XXX    0   
TAP  Täschalp        rre250c0   XX             XXX    XXX    0   
VOU  Vouasson        rre250c0   XX             XXX    XXX    0   

И вот мой код:

statList = ["ARA", "BOQ", "BRE", "CDR", "CTZ", 
      "FEP", "HOL", "TRI", "TAP", "VOU"] 

legend34413 = open("textfile.txt", "r") 

for k in statList: 
    for i in legend34413: 
     print k #always prints "ARA" 
     #do more stuff 

Тем не менее, кажется, что мой первый за цикл делает не пройти через весь statList. Он печатает только ARA для каждой строки в файле, но затем не следующий, который будет BOQ. Почему это ?!

ответ

4

Как только цикл выполнил один раз и напечатал ARA для каждой строки в файле, он достигнет конца файла и исчерпал итератор. Если вы хотите, чтобы вернуться назад и начать заново с самого начала, вам нужно будет перемотать его:

for k in statList: 
    for i in legend34413: 
     print k 
    legend34413.seek(0) 

Теперь ваш код будет печатать ARA один раз для каждой строки в файле. Затем он будет печатать BOQ один раз для каждой строки в файле, затем он будет печатать BRE один раз для каждой строки и так далее.

+0

ах, спасибо! понял! – Stophface

2

Внутренне, первый шаг в протоколе итерации Python является создание объекта итератора для Iterable, который вы хотите перебрать. Так в цикле, как for item in l:, где l представляет собой список, Python сначала создает объект итератора для l и затем итерация по что объект:

iterator_object = iter(l) 
iterator_object.__next__() 
iterator_object.__next__() 
... 

Это также первый создает объект-итератор, когда он перебирает над файловым объектом. Но, и это ключевой момент, файловый объект является его собственным итератором (f = iter (f)). Таким образом, используя тот же протокол итерации,

f = iterator_object = iter(f) 
f.__next__() 
f.__next__() 
... 

И вы можете увидеть, что l может повторяться через любое количество раз, в то время как f истощается после первого прохода.

Так что, когда ваш код достигает внутренний цикл второй раз, объект итератора, который Python внутренне получает от legend34413, который legend34413, исчерпан. Поэтому для последующих statList элементов утверждения печати не достигается.