Python: отмените операцию чтения файла Python(), так что указатель файла возвращается в исходное состояние
Я просматриваю указатель файла Python текстового файла в режиме только для чтения, используя file.readline(), который ищет специальную строку. Как только я нахожу эту строку, я хочу передать указатель файла методу, который ожидает, что указатель файла будет в START этого readline (не сразу после него.)
Как я могу отменить одну операцию file.readline() на указателе файла?
Ответы
Ответ 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