Подтвердить что ты не робот

Смешивание файлов и циклов

Я пишу script, который регистрирует ошибки из другой программы и перезапускает программу, где она остановилась при обнаружении ошибки. По каким-то причинам разработчики этой программы не считали необходимым поместить эту функциональность в свою программу по умолчанию.

В любом случае программа принимает входной файл, анализирует его и создает выходной файл. Входной файл находится в определенном формате:

UI - 26474845
TI - the title (can be any number of lines)
AB - the abstract (can also be any number of lines)

Когда программа выдает ошибку, она дает вам справочную информацию, необходимую для отслеживания ошибки, а именно: пользовательский интерфейс, какой раздел (название или реферат) и номер строки относительно начала заголовка или абстракции. Я хочу записать нарушающие предложения из входного файла с функцией, которая принимает номер ссылки и файл, находит предложение и записывает его в журнал. Лучший способ, который я мог бы сделать, - это перемещаться вперед по файлу определенное количество раз (а именно, n раз, где n - номер строки относительно начала seciton). Способ, который, как представляется, имеет смысл сделать это:

i = 1
while i <= lineNumber:
    print original.readline()
    i += 1

Я не вижу, как это может заставить меня потерять данные, но Python думает, что это будет, и говорит ValueError: Mixing iteration and read methods would lose data. Кто-нибудь знает, как это сделать должным образом?

4b9b3361

Ответ 1

Вы получаете значение ValueError, потому что ваш код, вероятно, имеет for line in original: в дополнение к original.readline(). Легкое решение, которое устраняет проблему, не делая вашу программу медленнее или потребляя больше памяти, меняет

for line in original:
    ...

к

while True:
    line = original.readline()
    if not line: break
    ...

Ответ 2

Используйте for и enumerate.

Пример:

for line_num, line in enumerate(file):
    if line_num < cut_off:
        print line

ПРИМЕЧАНИЕ. Предполагается, что вы уже очищаете свои файлы и т.д.

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

Ответ 3

Предполагая, что вам нужна только одна строка, это может помочь

import itertools

def getline(fobj, line_no):
    "Return a (1-based) line from a file object"
    return itertools.islice(fobj, line_no-1, line_no).next() # 1-based!

>>> print getline(open("/etc/passwd", "r"), 4)
'adm:x:3:4:adm:/var/adm:/bin/false\n'

Возможно, вы захотите поймать ошибки StopIteration (если в файле меньше строк).