Можно ли предотвратить доступ итератора к концу файла? - PullRequest
1 голос
/ 01 июля 2019

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

В принципе, я думал, что вы могли бы сделать что-то вроде этого:

ref = open(ref_file)
with ref:
    for row in ref:
         break

with ref:
    for row in ref:
        print(row)

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

with ref:
    for row in ref:
         break

    for row in ref:
        print(row)

Казалось, это работает как ожидалось. Потрясающие. Итак, следующее, что я попробовал, это:

with ref:
    for i in range(0,10):
        for row in vcf:
             break

        for row in vcf:
            print(row)

То, что я ожидал бы здесь произойти, это, по сути, печатать чередующиеся строки до тех пор, пока диапазон 0,10 не будет исчерпан. Вместо этого я печатаю вторую строку файла, и она останавливается.

Есть ли лучший способ запретить итератору достигать EOF? Что мне не хватает? Я как-то вырываюсь из утверждения with и упускаю суть?

EDIT:

Хорошо, последний пример не является примером проблемы, с которой я столкнулся.

with ref:
    for i in range(0,10):
        for row in vcf:
             break

        for row in vcf:
            print(row)
            break

Это работает как ожидалось ... Что на самом деле заставляет меня думать, что я что-то упустил в своем реальном коде. Я все еще буду благодарен за комментарии о лучших способах предотвращения достижения EOF итератором.

1 Ответ

2 голосов
/ 01 июля 2019

Здесь отступ неправильный: он читает одну строку, затем разрывает, затем читает остальную часть файла, 10 раз:

with ref:
    for i in range(0,10):
        for row in vcf:
             break

        for row in vcf:
            print(row)

обратите внимание, что вы можете выполнять итерацию вручную, используя next вместо выделения изfor петля.Более pythonic:

for _ in range(10):
    next(vcf,None)

# unindent here
for row in vcf:
    print(row)

аргумент None в next гарантирует, что даже если файл короче 10 строк, он не поднимает StopIteration, но выдает значение по умолчанию (что вы 'повторное игнорирование)

...