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

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

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

32
задан smci 28 November 2018 в 01:38
поделиться

4 ответа

Вы должны запомнить позицию, вызвав 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. Возможно, есть более питонический способ сделать это.

46
ответ дан 27 November 2019 в 20:32
поделиться

Вы записываете начальную точку строки с помощью 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 для сокетов и т. Д. И т. Д.

11
ответ дан 27 November 2019 в 20:32
поделиться

Если ваш метод просто хочет перебрать файл, вы можете использовать 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
ответ дан 27 November 2019 в 20:32
поделиться
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
1
ответ дан 27 November 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: