Как читать файлы N строк за раз в Python?
Мне нужно прочитать большой файл, читая не более N строк за раз, до EOF. Каков наиболее эффективный способ сделать это в Python? Что-то вроде:
with open(filename, 'r') as infile:
while not EOF:
lines = [get next N lines]
process(lines)
Ответы
Ответ 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]]