2012-04-21 47 views
38

我有一個問題要了解迭代上的一個文件,在這裏,我去了我的解釋類型和結果的文件:迭代上使用Python

>>> f = open('baby1990.html', 'rU') 
>>> for line in f.readlines(): 
>>> print(line) 

>>> ... 
>>> ... all the lines from the file appear here 
>>> ... 

當我試圖重複在同一開放再次文件我什麼也沒有!

>>> f = open('baby1990.html', 'rU') 
>>> for line in f.readlines(): 
>>> print(line) 
>>> 
>>> 

有沒有輸出,解決這個我已經關閉()的文件,然後再次打開它閱讀!這是一種正常的行爲?

回答

61

是的,這是正常的行爲。你基本上讀取到文件末尾的第一次(可以排序的圖像並作爲讀取磁帶),所以,除非你重新設置,使用f.seek(0)要麼重新定位的開始,你不能從中讀取更多該文件,或關閉它,然後再打開它將從文件的開頭開始。

如果你願意,你可以使用with語法,而不是它會自動關閉該文件爲您服務。

例如,

with open('baby1990.html', 'rU') as f: 
    for line in f: 
    print line 

一旦該塊被執行完畢後,文件會自動關閉你的,所以你可以沒有自己明確地關閉文件多次執行此塊和讀取文件再次這樣。

+0

OP想要幫助理解什麼是當一個文件對象要去概念的用戶被消耗。 – 2012-04-21 01:06:46

+0

我剛剛添加了部分解釋 – Levon 2012-04-21 01:07:45

+1

如果您使用'readlines()',沒有理由再次讀取文件兩次。 – 2012-04-21 05:49:19

1

當然。 這是正常和理智的行爲。 而不是關閉和重新打開,你可以rewind該文件。

+0

這是不利於誰是不熟悉的讀指針 – scubbo 2017-12-20 00:54:51

8

文件對象是一個緩衝器。從緩衝區中讀取時,讀取的部分被消耗(讀取位置向前移動)。當你讀完整個文件時,讀取位置在EOF處,所以它不返回任何內容,因爲沒有什麼可讀的。

如果你有,出於某種原因,恢復一個文件對象上的讀取位置,你可以這樣做:

f.seek(0) 
13

由於文件對象讀取文件,它使用一個指針跟蹤的地方它是。如果你閱讀了文件的一部分,然後再回到它,它會從你離開的地方繼續。如果您閱讀整個文件並返回到相同的文件對象,那麼將會像讀取空文件一樣,因爲指針位於文件的末尾,並且沒有剩下要讀的內容。您可以使用file.tell()來查看指針所在文件的位置,並使用file.seek來設置指針。例如:

>>> file = open('myfile.txt') 
>>> file.tell() 
0 
>>> file.readline() 
'one\n' 
>>> file.tell() 
4L 
>>> file.readline() 
'2\n' 
>>> file.tell() 
6L 
>>> file.seek(4) 
>>> file.readline() 
'2\n' 

此外,你應該知道,file.readlines()讀取整個文件,並將它作爲一個列表。這是用的,因爲你可以替換:

for line in file.readlines(): 
    #do stuff 
file.seek(0) 
for line in file.readlines(): 
    #do more stuff 

有:

lines = file.readlines() 
for each_line in lines: 
    #do stuff 
for each_line in lines: 
    #do more stuff 

您也可以遍歷一個文件,每次一行,未持有在內存中的整個文件(這可能是對於非常大的文件,這樣做是非常有用的):

for line in file: 
    #do stuff