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

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

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

  • Как проверить соответствие словаря с пакетом doctest-пакета Python?
  • как изменить столбец Dataframe из типа String в Double type в pyspark
  • Вызов функций с несколькими аргументами при использовании Groupby
  • Извлечение элементов из QueryDict
  • int ((0.1 + 0.7) * 10) = 7 на нескольких языках. Как предотвратить это?
  • Как преобразовать 2D-массив Numpy с объектом dtype в обычный 2D-массив поплавков
  • Подпроцесс Поменять недопустимый аргумент / сломанный канал при общении с программой C
  • Pig Latin Translator
  • 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 - лучший язык программирования в мире.