我正在为一个web应用程序编写一个日志文件查看器,为此我想对日志文件的行进行分页。文件中的项是基于最新项的行。
所以我需要一个tail()
方法,它可以从底部读取n
行并支持偏移量。我想到的是这样的:
def tail(f, n, offset=0):
"""Reads a n lines from f with an offset of offset lines."""
avg_line_length = 74
to_read = n + offset
while 1:
try:
f.seek(-(avg_line_length * to_read), 2)
except IOError:
# woops. apparently file is smaller than what we want
# to step back, go to the beginning instead
f.seek(0)
pos = f.tell()
lines = f.read().splitlines()
if len(lines) >= to_read or pos == 0:
return lines[-to_read:offset and -offset or None]
avg_line_length *= 1.3
这样做合理吗?使用偏移量跟踪日志文件的建议方法是什么?
这可能比你的快。对线的长度没有任何假设。一次返回一个块,直到找到正确数量的'\n'字符。
我不喜欢在实际情况下,当你永远不可能知道这样的事情的时候,对线的长度做一些复杂的假设。
通常,这将在第一次或第二次通过循环时定位最后20行。如果你的74个字符的东西是准确的,你使块大小2048,你将尾随20行几乎立即。
而且,我也不会消耗大量的大脑卡路里来巧妙地调整物理操作系统块。使用这些高级I/O包,我怀疑您会看到试图在OS块边界上对齐的任何性能结果。如果使用较低级别的I/O,则可能会看到加速。
如果可以读取整个文件,则使用deque。
在2.6之前,deques没有maxlen选项,但是它很容易实现。
如果需要从末尾读取文件,则使用gallop(也称为指数)搜索。
假设Python 2上有一个类似unix的系统,您可以执行以下操作:
对于python 3,您可以执行以下操作:
相关问题 更多 >
编程相关推荐