Я просматриваю указатель файла Python текстового файла в режиме только для чтения, используя file.readline (), ища специальная линия. Как только я нахожу эту строку, я хочу передать указатель файла методу, который ожидает, что указатель файла будет в START этой строки чтения (не сразу после нее).
Как по сути отменить один файл. Операция readline () для указателя файла?
Вы должны запомнить позицию, вызвав file.tell()
перед строкой чтения, а затем вызвав 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
. Возможно, есть более питонический способ сделать это.
Вы записываете начальную точку строки с помощью 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'
>>>
как вы видите, «пара» поиск / сообщение «отменяет», так сказать, перемещение указателя файла, выполняемое строкой чтения
. Конечно, это может работать только с реальным доступным для поиска файлом (т.е. дисковым), но не (например) с файловыми объектами, созданными с помощью метода makefile для сокетов и т. Д. И т. Д.
Если ваш метод просто хочет перебрать файл, вы можете использовать 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
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