Если чтение всего файла приемлемо, используйте deque.
from collections import deque
deque(f, maxlen=n)
До 2.6, у deques не было параметра maxlen, но его достаточно просто реализовать.
import itertools
def maxque(items, size):
items = iter(items)
q = deque(itertools.islice(items, size))
for item in items:
del q[0]
q.append(item)
return q
Если требуется прочитать файл с конца, тогда используйте поиск по галопу (он же экспоненциальный).
def tail(f, n):
assert n >= 0
pos, lines = n+1, []
while len(lines) <= n:
try:
f.seek(-pos, 2)
except IOError:
f.seek(0)
break
finally:
lines = list(f)
pos *= 2
return lines[-n:]