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

Python: отмените операцию чтения файла Python(), так что указатель файла возвращается в исходное состояние

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

Как я могу отменить одну операцию file.readline() на указателе файла?

4b9b3361

Ответ 1

Вы должны запомнить позицию, вызвав file.tell() перед readline, а затем вызывая file.seek() для перемотки назад. Что-то вроде:

fp = open('myfile')
last_pos = fp.tell()
line = fp.readline()
while line != '':
  if line == 'SPECIAL':
    fp.seek(last_pos)
    other_function(fp)
    break
  last_pos = fp.tell()
  line = fp.readline()

Я не могу вспомнить, можно ли вызвать file.seek() внутри цикла for line in file, поэтому я обычно просто пишу цикл while. Вероятно, существует гораздо более питонический способ сделать это.

Ответ 2

Вы записываете начальную точку линии с помощью thefile.tell() перед вызовом readline и возвращаетесь к этой точке, если вам нужно, с помощью thefile.seek.

>>> with open('bah.txt', 'w') as f:
...   f.writelines('Hello %s\n' % i for i in range(5))
... 
>>> with open('bah.txt') as f:
...   f.readline()
...   x = f.tell()
...   f.readline()
...   f.seek(x)
...   f.readline()
... 
'Hello 0\n'
'Hello 1\n'
'Hello 1\n'
>>> 

как вы видите, поиск/подсказка "пара" означает "отмена", так сказать, движения указателя файла, выполняемого readline. Конечно, это может работать только с фактическим файлом поиска (то есть с диском), а не (например,) на файлоподобных объектах, построенных с использованием сокетов и т.д. И т.д.

Ответ 3

Если ваш метод просто хочет выполнить итерацию через файл, вы можете использовать itertools.chain для создания соответствующего итератора:

import itertools

def process(it):
    for line in it:
        print line,

with open(filename,'r') as f:
    for line in f:
        if 'marker' in line:
            it=itertools.chain((line,),f)
            process(it)
            break

Ответ 4

fin = open('myfile')
for l in fin:
    if l == 'myspecialline':
        # Move the pointer back to the beginning of this line
        fin.seek(fin.tell() - len(l))
        break
# now fin points to the start of your special line