Вернитесь к определенной строке при чтении файла в цикле - PullRequest
0 голосов
/ 14 октября 2019

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

Например:

with open(filename) as f:
    for inputline in f:
        if inputline.strip() == 'abc':
            #goto line 3 and start the loop again
        print(inputline.strip())

Допустим, входной файл:

1
2
3
4
5
abc
6
7

вывод должен быть:

1
2
3
4
5
3
4
5
3
4
5.....

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

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Вы можете использовать список для отслеживания конечной позиции каждой строки (которая также является начальной позицией следующей строки), вызвав метод tell объекта файла, а затем используйте метод seekчтобы переместить указатель файла обратно в положение предыдущей строки:

with open(filename) as f:
    positions = []
    for inputline in f:
        position = f.tell()
        if not positions or position > positions[-1]:
            positions.append(position)
        inputline = inputline.strip()
        if inputline == 'abc':
            # the starting position of line number 3 is the ending position of line number 2
            f.seek(positions[1])
        else:
            print(inputline)
0 голосов
/ 14 октября 2019

Вы можете сделать это с помощью рекурсивной функции в сочетании с перечислением:

def fn(lines, index=0):
    for i, line in enumerate(lines, start=index):
    if line.strip() == 'abc':
        fn(lines, i)
    else:
        print(line)

with open(filename) as f:
    fn(f.readlines())
0 голосов
/ 14 октября 2019

Вы можете использовать file.seek():

with open(filename) as f:
    while f.readable():
        inputline = next(f)
        if inputline.strip() == 'abc':
            f.seek(3)
            next(f)
        else:
            print(inputline.strip())
...