python一次读取多行




如何在Python中一次读取N行文件? (6)

我需要通过一次读取最多N行读取一个大文件,直到EOF。 在Python中最有效的方法是什么? 就像是:

with open(filename, 'r') as infile:
    while not EOF:
        lines = [get next N lines]
        process(lines)

for循环怎么样?

with open(filename, 'r') as infile:
    while not EOF:
        lines = []
        for i in range(next N lines):
            lines.append(infile.readline())
        process(lines)

一个解决方案是列表理解和切片运算符:

with open(filename, 'r') as infile:
    lines = [line for line in infile][:N]

在此lineslines元组。 但是,这会将整个文件加载到内存中。 如果你不想要这个(即文件可能真的很大),还有另一个解决方案,使用itertools包中的生成器表达式和islice

from itertools import islice
with open(filename, 'r') as infile:
    lines_gen = islice(infile, N)

lines_gen是一个生成器对象,它为您提供文件的每一行,并且可以在这样的循环中使用:

for line in lines_gen:
    print line

这两种解决方案最多可以提供N行(如果文件没有那么多,则会更少)。


如果您可以提前阅读完整档案;

infile = open(filename, 'r').readlines()
my_block = [line.strip() for line in infile[:N]]
cur_pos = 0
while my_block:
    print (my_block)
    cur_pos +=1
    my_block = [line.strip() for line in infile[cur_pos*N:(cur_pos +1)*N]]

您可能需要做一些简单的事情:

lines = [infile.readline() for _ in range(N)]

评论后更新

lines = [line for line in [infile.readline() for _ in range(N)] if len(line) ]

我需要从非常大的文件(~1TB)的文件中一次读取n行,并编写了一个简单的包来执行此操作。 如果你pip install bigread ,你可以这样做:

from bigread import Reader

stream = Reader(file='large.txt', block_size=10) 
for i in stream:
  print(i)

block_size是一次读取的行数。


文件对象是Python中的行上的迭代器。 要一次迭代文件N行,你可以使用grouper()itertools的配方 (参见什么是最“pythonic”方式迭代块中的列表? ):

#!/usr/bin/env python2

from itertools import izip_longest

def grouper(iterable, n, fillvalue=None):
    args = [iter(iterable)] * n
    return izip_longest(*args, fillvalue=fillvalue)

with open(filename) as f:
     for lines in grouper(f, N, ''):
         assert len(lines) == N
         # process N lines here




iterator