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

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

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

7 Solutions collect form web for “Как читать файлы N строк за раз в Python?”

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

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

После этого lines являются кортежами строк. Однако это приведет к загрузке полного файла в память. Если вы не хотите этого (т. islice Если файл может быть действительно большим), есть другое решение, использующее выражение генератора и 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 строк (или меньше, если файл не так много).

Файловый объект является итератором по строкам в 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 

Этот код будет работать с любым количеством строк в файле и любым 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) 

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

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

может быть:

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

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

См. Эту ссылку

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

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

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

 lines = [line for line in [infile.readline() for _ in range(N)] if len(line) ] 
  • Поиск регулярного выражения Python для строки в начале строки в файле
  • Открыть файл для чтения / записи, при необходимости создать
  • Python пишет в файл, возвращает пустой файл
  • Python pickle / unpickle список в / из файла
  • Автоматическое создание каталогов с выходом файла
  • Python разделил URL-адрес, чтобы найти имя и расширение имени
  • Открытие файла в режиме добавления и поиск
  • Чтение из текстового файла с python - первая строка пропущена
  • Разница между разбором текстового файла в режиме r и rb
  • Напишите новые данные в середине файла
  • Рекурсивное копирование файлов с прогрессом
  • Python - лучший язык программирования в мире.