2012-05-12 24 views
2

可能重複:
How to get line count cheaply in Python?可以確定文件中存在多少行,而無需每行迭代?

美好的一天。我在下面有一些代碼,它實現了每行文件讀取和計數器迭代。

def __set_quantity_filled_lines_in_file(self): 
    count = 0 
    with open(self.filename, 'r') as f: 
     for line in f: 
      count += 1 
    return count 

我的問題是,有沒有方法可以確定當前文件中有多少行文本數據,而無需每行迭代?

謝謝!

+0

謝謝保羅,這是同樣的問題。 –

+0

更好的方式來使用緩衝區來處理連線。 –

+0

[This question](http://stackoverflow.com/questions/9855895/is-there-a-built-in-python-analog-to-unix-wc-for-sniffing-a-file)也是相關的。 –

回答

4

一般它不可能做的比讀取文件中的每個字符計數換行符更好。

如果您知道有關文件內部結構的詳細信息,則可能是可能的。例如,如果文件長度爲1024kB,每行長度爲1kB,則可以推斷文件中有1024行。

+0

我在每一行中都有不同數量的字符,但是感謝您的提問! –

1

不,這些信息只能通過迭代整個文件的內容來檢索(或者將整個文件讀入內存中,但除非你確定文件總是小一點,否則不要考慮這樣做)。

即使不循環的文件內容,你調用的函數做。例如,len(f.readlines())會將整個文件讀入列表中以計算元素的數量。這是非常低效的,因爲你根本不需要存儲文件內容。

+0

我認爲這裏的其他帖子已經證明這個說法不真實。迭代不是唯一的方法。 –

+2

@JasonMorgan - 你是否在說你知道如何在小於O(n)的時間內對文件中出現的\ r \ n進行計數?如果是這樣,請提供詳細信息。 –

+1

@JasonMorgan還有什麼你的Counter()不是迭代文件的內容嗎?你的'f.read()'除了讀取整個文件的內容還需要不必要的內存嗎? – glglgl

2

我不確定Python是否有這個功能,但是非常懷疑它,但它本質上需要讀取整個文件。換行符由\ n字符表示(實際上是系統依賴的),因此無法通過整個文件知道文件中存在多少文件。

0

這給出了答案,但讀取整個文件,然後在列表

len(f.readlines()) 
+1

因此需要不必要的內存量。 – glglgl

1

您可以使用readlines方法()文件的方法存儲線,這可能是最簡單的。

如果你想與衆不同,你可以使用閱讀()成員函數來獲取整個文件和計數CR,LF,使用collections.Counter類CRLR LFCR字符組合。
但是,您將不得不處理終止線路的各種方式。
喜歡的東西:

import collections 
f=open("myfile","rb") 
d=f.read() 
f.close() 
c=collections.Counter(d) 
lines1=c['\r\n'] 
lines2=c['\n\r'] 
lines3=c['\r']-lines1-lines2 
lines4=c['\n']-lines1-lines2 
nlines=lines3+lines4 
+0

我對最簡單的方式並不感興趣,我正在尋找一種可擴展的方式和最快的方式來執行此操作。 –

+0

假設你的文件總是小於2G,那麼最快和最可伸縮的方法就是用C來完成。在C中創建一個Python擴展,它只是從內存中的緩衝區中計算行數。 –

+0

'\ n \ r'在大多數平臺上將被視爲兩行,不是? –

相關問題