2017-02-06 3 views
1

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

+0

вы имеете в виду: вы хотите прочитать 5 первых строк один за другим, а затем остальные? –

+0

@ Jean-FrançoisFabre да – ddd

+0

Я неправильно понял вопрос извините – roganjosh

ответ

3

Один подход должен был бы создать список из 5 первых линий, и прочитать остальное в большой буфер:

with open("input.txt") as f: 
    first_lines = [f.readline() for _ in range(5)] 
    rest_of_lines = f.read() 

или более симметричным для первой части: создать 1 маленький буфер с 5 строк :

first_lines = "".join([f.readline() for _ in range(5)]) 

в качестве альтернативы, с чисто точки ввода/вывода зрения, самым быстрым будет

with open("input.txt") as f: 
    lines = f.read() 

и использовать линии разделения генератор для чтения 5 первых линий (splitlines() будет иметь катастрофические последствия в плане копирования памяти, найти реализацию here)

+0

Действительно ли это на самом деле? Из того, что я собрал вместе из моего чтения, так что я, возможно, ошибаюсь, 'read()' буферирует строки так или иначе, поэтому может быть проще просто «прочитать» файл за один раз ради 5 строк? – roganjosh

+1

Возможно, ввод-вывод будет быстрее, но после этого вам придется разделить содержимое на первые 5 строк, а остальное: удвоить требуемую память. –

+0

Интересно, не думал об этом так. – roganjosh

1

объекты файлов в питоне довольно удобно их собственные объекты итераторов так что при вызове for line in f: ... вы получаете файл по строкам. Объект файла имеет то, что обычно называют курсором, который отслеживает, откуда вы читаете. когда вы используете общий цикл for, этот курсор каждый раз переходит к следующей новой строке и возвращает то, что он прочитал. Если прервать этот цикл до конца файла, вы можете забрать обратно вверх, где вы остановились с другим контуром или просто вызовом f.read() прочитать остальную часть файла

with open(inputfile, 'r') as f: 
    lineN = 0 
    header = "" 
    for line in f: 
     header = header + line 
     lineN += 1 
     if lineN >= 4: #read first 5 lines (0 indexed) 
      break 
    body = f.read() #read the rest of the file
Смежные вопросы