使用Python获取文件的最后n行,类似于tail

我正在为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

这是合理的方法吗?建议使用带偏移量尾部日志文件的推荐方式是什么?

回答:

def tail(f, n, offset=None):

"""Reads a n lines from f with an offset of offset lines. The return

value is a tuple in the form ``(lines, has_more)`` where `has_more` is

an indicator that is `True` if there are more lines in the file.

"""

avg_line_length = 74

to_read = n + (offset or 0)

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], \

len(lines) > to_read or pos > 0

avg_line_length *= 1.3

以上是 使用Python获取文件的最后n行,类似于tail 的全部内容, 来源链接: utcz.com/qa/432404.html

回到顶部