2011-07-13 34 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)