Как прочитать файл N строк одновременно в Python?

python file-io iterator

36338 просмотра

10 ответа

347 Репутация автора

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

with open(filename, 'r') as infile:
    while not EOF:
        lines = [get next N lines]
        process(lines)
Автор: madprogrammer Источник Размещён: 29.04.2011 01:43

Ответы (10)


0 плюса

11851 Репутация автора

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

with open(filename, 'r') as infile:
    while not EOF:
        lines = []
        for i in range(next N lines):
            lines.append(infile.readline())
        process(lines)
Автор: Spencer Rathbun Размещён: 29.04.2011 01:50

2 плюса

6402 Репутация автора

может быть:

for x in range(N):
  lines.append(f.readline())
Автор: yurib Размещён: 29.04.2011 01:50

0 плюса

15576 Репутация автора

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

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

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

lines = [line for line in [infile.readline() for _ in range(N)] if len(line) ]
Автор: quamrana Размещён: 29.04.2011 01:50

9 плюса

502 Репутация автора

Этот код будет работать с любым количеством строк в файле и любым 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)
Автор: Anatolij Размещён: 29.04.2011 01:51

1 плюс

1909 Репутация автора

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

Ссылка на эту ссылку

Автор: Konstant Размещён: 29.04.2011 01:54

34 плюса

5605 Репутация автора

Решение

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

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

Автор: Martin Thurau Размещён: 29.04.2011 01:55

13 плюса

292383 Репутация автора

Файловый объект - это итератор над строками в 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
Автор: jfs Размещён: 30.04.2011 10:49

0 плюса

26 Репутация автора

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

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]]
Автор: ChrisEisenhart Размещён: 01.11.2017 09:51

0 плюса

11122 Репутация автора

Мне нужно было читать по n строк одновременно из файлов для очень больших файлов (~ 1 ТБ) и написать для этого простой пакет . Если вы pip install bigread, вы можете сделать:

from bigread import Reader

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

block_size количество строк для чтения за один раз.

Автор: duhaime Размещён: 28.06.2018 12:39

0 плюса

1 Репутация автора

Я искал ответ на тот же вопрос, но мне не очень понравился какой-либо предложенный материал ранее, поэтому я закончил тем, что написал эту немного некрасивую вещь, которая делает именно то, что я хотел, без использования странных библиотек .

def test(filename, N):
    with open(filename, 'r') as infile:
        lines = []
        for line in infile:
            line = line.strip()
            if len(lines) < N-1:
                lines.append(line)
            else:
                lines.append(line)
                res = lines
                lines = []
            yield res
        else:
            if len(lines) != 0:
                yield lines
Автор: Haromn Размещён: 21.08.2018 07:22
Вопросы из категории :
32x32