2015-05-05 92 views
1

我不太瞭解Python如何遍歷列表和文件。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 

然而,似乎是我的第一個for循環不不通過整個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的迭代協議的第一步是創建一個iterator對象爲您要遍歷一個迭代。因此,在一個像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是第一個階段後耗盡。

所以,當你的代碼達到內部的for循環的第二次迭代對象的Python從內部legend34413得到,這是legend34413,是疲憊。因此,後續的statList元素永遠不會達到打印語句。