Подтвердить что ты не робот

Как читать файлы N строк за раз в Python?

Мне нужно прочитать большой файл, читая не более N строк за раз, до EOF. Каков наиболее эффективный способ сделать это в Python? Что-то вроде:

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

Ответ 1

Одним из решений было бы понимание списка и оператор среза:

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

После этого lines является кортежем строк. Однако это приведет к загрузке полного файла в память. Если вы не хотите этого (т.е. Если файл может быть действительно большим), существует другое решение с использованием выражения генератора и islice из пакет itertools:

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 строк (или меньше, если файла не так много).

Ответ 2

Файловый объект является итератором по строкам в Python. Чтобы итерации по файлу N строк за раз, вы можете использовать рецепт grouper() itertools (см. Какой самый "питонический" способ перебора списка в кусках?):

#!/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

Ответ 3

Этот код будет работать с любым количеством строк в файле и любым N. Если у вас есть 1100 lines в файле и N = 200, вы получите 5 раз, чтобы обработать куски 200 строк и один раз со 100 строками.

with open(filename, 'r') as infile:
    lines = []
    for line in infile:
        lines.append(line)
        if len(lines) >= N:
            process(lines)
            lines = []
    if len(lines) > 0:
        process(lines)

Ответ 4

возможно:

for x in range(N):
  lines.append(f.readline())

Ответ 5

Я думаю, вы должны использовать куски вместо указания количества строк для чтения. Это делает ваш код более надежным и универсальным. Даже если строки большие, использование chunk будет загружать в память только заданный объем данных.

Обратитесь к этой ссылке

Ответ 6

Как насчет цикла for?

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

Ответ 7

Возможно, вам придется сделать что-то простое:

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

Обновить после комментариев:

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

Ответ 8

Если вы можете прочитать полный файл заблаговременно;

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]]