2015-07-05 2 views
3

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

Я сначала подумал, что что-то подобное, что бы это сделать:

file = open("fileName", 'r') 
first_line = file.readline() 
DoStuff_1(first_line) 

for line in file: 
    DoStuff_2(line) 

file.close() 

Но этот вопрос с помощью этого сценария является то, что первая строка, которая передается DoStuff_2 является второй линии, а не первый. У меня нет хорошей интуиции о том, какой объект file есть. Я думаю, что это итератор и не знаю, как с этим бороться. Плохое решение, которое я нашел,

file = open("fileName", 'r') 
first_line = file.readline() 

count = 0 
for line in file: 
    if count == 0: 
     count = 1 
     DoStuff_1(first_line) 
    DoStuff_2(line) 

file.close() 

Но это довольно тупой и вычислительно немного дорого, как это работает, если заявление на каждой итерации.

+1

'open' возвращает генератор в python. : P – NightShadeQueen

ответ

5

Вы можете сделать это:

with open('fileName', 'r') as file: 
    first_line = file.readline() 
    DoStuff_1(first_line) 
    DoStuff_2(first_line) 

    # remaining lines 
    for line in file: 
     DoStuff_2(line) 

Обратите внимание, что я изменил код, чтобы использовать with так file автоматически закрывается.

+0

Ха-ха, это было так очевидно! Я думаю, что, когда вы находитесь в середине более сложного кода, вы пропустите очевидное, но как только проблема сводится к его существенным элементам, вопрос был действительно очевиден. Спасибо. Я не использовал 'with', потому что я не знал, будет ли объект' file' существовать в среде каждой функции, вызываемой внутри '' '. Это? В настоящее время я просто определяю 'файл' как глобальный. –

+1

@ Remi.b Это то, что переполнение стека, на мой взгляд, позволяет другим людям видеть прошлые наши слепые пятна. Что касается использования 'with': я просто предположил, что использование в вашем вопросе было первым, когда был назначен« файл », и в этом случае использование' with' является хорошей практикой. Если 'файл' используется и в других местах, вам нужно больше узнать о том, какое точное решение использовать. –

2

Я хотел бы использовать генератор для абстрагирования вашего общего потока управления. Что-то вроде:

def first_and_file(file_obj): 
    """ 
    :type file_obj: file 
    :rtype: (str, __generator[str]) 
    """ 
    first_line = next(file_obj) 

    def gen_rest(): 
     yield first_line 
     yield from file_obj 

    return first_line, gen_rest() 

В Python 2.7, замените yield from для:

for line in file_obj: 
    yield line 
1

Другой ответ, это просто открыть файл дважды.

with open("file.txt", "r") as r: 
    Do_Stuff1(r.readline()) 

with open("file.txt", "r") as r: 
    for line in r: 
     Do_Stuff2(line) 
Смежные вопросы