2015-10-13 77 views
1

在遍歷文本文件和列表上的迭代期間,我發現了for循環的意外行爲。 文本文件test.txt只由兩個字符串組成:1)He said:和2)We said:。 首先for + forPython不等於'迭代'

file_ = open('c:\\Python27\\test.txt', 'r') 
list_ = ['Alpha','Bravo','Charlie'] 
try: 
    for string in file_: 
     for element in list_: 
      print string, element 
except StandardError: 
    print 'Ooops' 

回報絕對預見的結果是:

He said: Alpha 
He said: Bravo 
He said: Charlie 
We said: Alpha 
We said: Bravo 
We said: Charlie 

但是如果for順序改變爲

file_ = open('c:\\Python27\\test.txt', 'r') 
list_ = ['Alpha','Bravo','Charlie'] 
try: 
    for element in list_: 
     for string in file_: 
      print string, element 
except StandardError: 
    print 'Ooops' 

結果是完全不同的:

He said: Alpha 
We said: Alpha 

看起來像第一個for變得不可戰勝。爲什麼?

+0

是所有的代碼? – Onilol

+0

'lines = file.readlines()'然後只是在'lines'列表中進行迭代。 –

+0

[davidism](http://stackoverflow.com/users/400617/davidism), 感謝您的評論。前期問題非常緊密,但對我而言,它有一點不同。 –

回答

3

當您完成對文件的for循環時,您「消耗」它。您將不得不回到file_.seek(0)的外循環迭代開始。或者使用原始的循環順序。

你可以用這個簡單的例子複製的行爲:

for string in file_: 
     print string 

    for string in file_: 
     print string 

在那裏你會看到第二個循環什麼都不做。

+0

謝謝,這是非常有力的例子 –

2

您需要使用file_.seek(0)才能返回到文件的開頭,以重新遍歷其內容。

你已經通過它通過迭代:for string in file_:,因此當前位置,通過調用file_.tell()獲得,將在字節文件的大小(如果我沒有記錯的話),標誌着結束。