2015-01-18 5 views
-2

next() Итерирует следующую строку в файле, но что делать, если вы хотите выполнить итерацию на 2 или 3 строки, а затем прочитать этот файл. Пример: скажем, вы хотите добавить число в сумму из файла. Но чтобы добраться до этого числа, вы должны пропустить файл, содержащий две строки, которые являются буквами.Продвинуть файловый объект более чем одной строки как способ пропустить пустые строки и строки, содержащие строки

Я пробовал что-то вроде amount = next(); next(), и это не сработало, или я использую его неправильно.

Любые идеи?

+0

@Martijn Pieters нет, ваша ошибка. Вам нужно отметить как дубликат, потому что их метод и мой метод и назначение очень разные. – eatAllYourPiePeter

+0

Альтернатива заключалась в том, чтобы закрыть сообщение как неясное; то, что вы делаете, совсем не ясно для меня, и я взял одну возможную интерпретацию. Лучше дать вам дубликат в таких случаях, когда частичный ответ лучше, чем ничего. Обратите внимание, что это * ответы * на обман, который здесь подсчитывается. Если вы все еще не согласны, см. [«Этот вопрос может уже иметь ответ здесь» - но это не так) (http://meta.stackoverflow.com/q/252252) для ваших вариантов здесь. –

+0

@Matijn Pieters Я хотел бы жить в мире, где я отправляю осмысленный вопрос, который является прямым и точным. Это было удалено из пуха. и это в контексте, специфичном для этого вопроса. То есть Я не размещал ни одного кода, не связанного с этим конкретным вопросом. Я хочу жить в этом мире, и поэтому я разместил этот вопрос, учитывая этот мир. Все было здорово, пока вы не пришли. Я чувствую, что это лучше, чем просто отменить то, что вы сделали, и позвольте мне вернуться к работе. – eatAllYourPiePeter

ответ

1

Для перехода более чем одну строку, вызовите next в цикле:

for _ in range(times_to_advance): 
    next(file_object) 

Как отмечалось @MartijnPieters в комментарии, это решение не является особенно эффективным. Его главным преимуществом является простота.

Однако, если ваш основной проблемой является производительность, вы должны использовать код, найденный в consume() recipe в itertools документации:

from itertools import islice 
next(islice(file_object, times_to_advance, times_to_advance), None) 
+0

Это же замечание для вас: Looping себя довольно неэффективно; используйте 'islice()' вместо этого, если необходимо, с началом и остановкой, равным количеству пропущенных строк. Также см. Рецепт '' consume() '(https://docs.python.org/2/library/itertools.html#recipes) в документации по itertools. –

2

Например

def skip_n_items(n, iterator): 
    for _ in range(n): next(iterator) 

, а затем, когда вы хотите, чтобы «пропустить 2 линии, затем получить третий «

skip_n_items(2, thefile) 
amount = next(thefile) 

(это, например, блок with open('the.file') as thefile:).

+0

Зацикливание себя довольно неэффективно; используйте 'islice()' вместо этого, если необходимо, с началом и остановкой, равным количеству пропущенных строк. Также см. ['Recume()' recipe] (https://docs.python.org/2/library/itertools.html#recipes) в документации 'itertools'. –

Смежные вопросы