如果可以读取整个文件,则使用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
如果需要从末尾读取文件,则使用gallop(也称为指数)搜索。
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:]