Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

for line in original:
    ...

Для

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

Другие советы

Использование for и перечислять.

Пример:

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

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

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

Если вам нужна только одна строка, это может помочь

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 (если в файле меньше строк).

Вот версия без уродливого шаблона while True и без других модулей:

for line in iter(original.readline, ''):
    if …:   # to the beginning of the title or abstract
        for i in range(lineNumber):
            print original.readline(),
        break
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top