您可以使用带有双端队列的尾部配方来获取大文件的最后几行:n
from collections import deque
def tail(fn, n):
with open(fn) as fin:
return list(deque(fin, n))
现在测试一下。
首先创建一个大文件:
>>> with open('/tmp/lines.txt', 'w') as f:
... for i in range(1,10000000+1):
... print >> f, 'Line {}'.format(i) # Python 3: print('Line {}'.format(i), file=f)
# about 128 MB on my machine
然后测试:
print tail('/tmp/lines.txt', 20)
# ['Line 9999981\n', 'Line 9999982\n', 'Line 9999983\n', 'Line 9999984\n', 'Line 9999985\n', 'Line 9999986\n', 'Line 9999987\n', 'Line 9999988\n', 'Line 9999989\n', 'Line 9999990\n', 'Line 9999991\n', 'Line 9999992\n', 'Line 9999993\n', 'Line 9999994\n', 'Line 9999995\n', 'Line 9999996\n', 'Line 9999997\n', 'Line 9999998\n', 'Line 9999999\n', 'Line 10000000\n']
这将返回文件的最后 n 行而不是文件的最后 X 个字节。数据的大小与行的大小相同——而不是文件的大小。文件对象 fin
用作文件行的迭代器,因此整个文件不会一次全部驻留在内存中。