2011-07-13 62 views
2

例如,我在一個文件中有2000行,並且我想一次讀500行,並在讀取另外500行之前對這500行進行操作。我想知道是否有人會爲我學習一些快速代碼。謝謝!Python 2.7:如何從文件一次只讀幾行?

+3

向我們展示你的代碼現在,我們將從那裏開始。 –

回答

7

您可以使用生成器將這些行組合在一起,並以便於在簡單for循環中使用的方式生成它們。這可能讓你開始:

def chunks_of(iterable, chunk_size=500): 
    out = [] 
    for item in iterable: 
     out.append(item) 
     if len(out) >= chunk_size: 
      yield out 
      out = [] 
    if out: 
     yield out 

然後,您可以使用此類似:

for chunk_of_lines in chunks_of(file('/path/to/file'), chunk_size=500): 
    # chunk_of_lines is 500 or fewer lines from the file 

(爲什麼「500或更少」因爲最後一個塊可能不是500行,如果行中的數字?該文件不是500的倍數。)

編輯:總是先檢查文檔。下面是從the itertools docs

def grouper(n, iterable, fillvalue=None): 
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return izip_longest(fillvalue=fillvalue, *args) 

配方這就造成對迭代ñ迭代器列表(在這種情況下,文件對象) - 因爲它們是相同的底層對象的所有迭代器,當一個人的進步,其餘的都會提前 - 然後拉下結果。 izip_longest的工作方式與izip類似,但將其結果與fillvalue一起填充,而不是像我的chunks_of函數那樣簡單地省略它們。

+1

我認爲對於絕對是初學者的人來說,發電機解決方案太複雜了。如果他們不能寫一個簡單的循環,他們不會理解生成器和yield語句。 –

+0

@eryksun d'oh!謝謝,好點 - 現在對我來說實際上更有意義。 – dcrosta

0

糾正我,但我認爲這個很基本的示例將工作太:

linesToProceed = 500 
with open(filename, 'r') as f: 
    lines = [] 
    for i,line in enumerate(f): 
     if (i + 1) % linesToProceed: 
      # do something with lines in lines 
      lines = [] 
     else: 
      lines.append(line)