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

StackOverflow https://stackoverflow.com/questions/3505479

Вопрос

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

Как мне по существу, отменить один файл. Операция 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'
>>> 

Как видите, поиск / скажи «пара» - «уничтожение», так сказать, движение указателя файла выполняется readline. Отказ Конечно, это может работать только на фактическом поименном (т. Е. Дисковой) файле, а не (например) на файловых объектах, построенных с методом 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

Если вы не знаете последнюю строку, потому что вы не посетили его, вы можете прочитать назад, пока не увидите символ Newline:

with open(logfile, 'r') as f:
    # go to EOF
    f.seek(0, os.SEEK_END)
    nlines = f.tell()
    i=0
    while True:
        f.seek(nlines-i)
        char = f.read(1)
        if char=='\n':
            break
        i+=1
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top