2015-08-15 33 views
2

我有一個關於生成器和文件對象的問題。Python生成器和文件對象

如果我寫的代碼

def iter(ls): 
    count=0 
    for k in ls: 
     if count==2: 
      break 
     count+=1 
    for k in ls: 
     yield k 

test=[1,2,3,4] 

k=iter(test) 
for i in k: 
    print i 

則輸出

是的,我能理解這一點,因爲在這段代碼break語句不會影響以下yield語句。

但是,如果我做類似的事情與文件,在這種情況下,我做一個「數據」的文件,這是寫

1 
2 
3 
4 

,如果我只更改線路

test=[1,2,3,4] → test=open("data","r") 

然後結果是

這意味着break語句以某種方式起作用,所以gentor for循環中的yield「yield」與前面的case不同。

這種差異的原因是什麼?

回答

3

是的,因爲文件對象也存儲它當前讀取的位置。所以當你嘗試迭代文件對象時(沒有執行.seek()),它會從下一行開始(你離開的地方)。這是在打開一個文件並且迭代一次之後,如果你試圖再次迭代它(不做.seek()),它不會產生任何結果,因爲在第一次迭代本身中,遊標位於文件的末尾,並且存在沒有別的可讀的。示例 -

我A.TXT -

1 
2 
3 
4 

碼 -

>>> for i in f: 
...  print(i) 
... 
1 

2 

3 

4 
>>> for i in f: 
...  print(i) 
... 
>>> 

-

正如上面所指出的,如果你想將文件移動光標到的開始文件,您將不得不使用file.seek(0),0指示移動起始位置。