2016-12-26 51 views
1

我正在嘗試計算文件中的行數,但出現了奇怪的結果。下面有一個MWE,我相信這是不言而喻的:使用Python擦除文件中的行數擦除文件

file=open('Example.txt','r') 

print(sum(1 for line in file)) 
print(len(file.readlines())) 

當我運行它,我得到的輸出X(行權數)和0。所以第二種方法要麼不工作,要麼讀取一個空的變量。如果我切換順序,我得到相同的結果,所以它正在工作,但不知何故變量被擦除。如果我使用相同的文件分配file_1file_2,並使用不同的變量運行每個方法,則會得到X和X,因此在完成操​​作後變量會被擦除。

我也試過從"r"改爲"r+",但沒有運氣。有人可以解釋這裏發生了什麼?對列表的操作不應該改變列表,至少這是我所教的內容。

謝謝!

回答

3

會發生什麼事是:

print(sum(1 for line in file)) 

讀取該文件,並排出,提供線迭代器。

當你然後做:

print(len(file.readlines())) 

你會0因爲迭代器從以前的迭代用盡結束。使用file.seek(0)可以再次遍歷它。

另外一個注意事項,當你讀文件時不需要使用'r',它已經是默認模式了。


在一般情況下,你可以找出一個迭代獲得通過它通過檢查iter(obj) is obj一次迭代後耗盡:

f = open('example.txt') 
print(iter(f) is f) # True 

如果是這樣的話,obj.__iter__回報self在其執行導致行爲目擊。

如果沒有,例如採取列表:

l = [1, 2] 
print(iter(l) is l) # False 

__iter__方法返回一個有光澤的新的迭代器對象(列表,這是一個list_iterator對象),可以通過多次迭代。

+0

謝謝你,我不知道這樣的事情可能發生。這個迭代器在哪裏顯式聲明?我怎麼知道我什麼時候會遇到這個問題?根據我對C和MATLAB的經驗,我必須重置迭代器,但在Python中,我確實認爲這是一個內部過程。 'r'是我原來的代碼中的剩餘部分,我將使用'r +',但感謝您的提示! – Alegom

+0

它是一個內置的,因此它在'C'中實現(很確定位於['fileobject.c'](https://github.com/python/cpython/blob/master/Objects/fileobject.c)) 。你可以通過檢查'iter(obj)是obj'來發現迭代器在迭代完成後會耗盡。如果是這種情況,'obj .__ iter__'在其實現中返回'self',導致所見證的行爲。如果沒有,'__iter__'方法返回一個閃亮的新迭代器對象,可以迭代多次@Alegom –

+0

你有什麼建議我應該留意這個事件嗎?在這種情況下,我的文件有15行。誰知道迭代器會很快耗盡? – Alegom