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

使用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

这是否一个合理的方法?建议使用什么方法来跟踪带有偏移量的日志文件?


临摹微笑
浏览 1926回答 3
3回答

月关宝盒

如果读取整个文件是可以接受的,那么使用deque。from&nbsp;collections&nbsp;import&nbsp;deque deque(f,&nbsp;maxlen=n)在2.6之前,deques没有maxlen选项,但是很容易实现。import&nbsp;itertoolsdef&nbsp;maxque(items,&nbsp;size): &nbsp;&nbsp;&nbsp;&nbsp;items&nbsp;=&nbsp;iter(items) &nbsp;&nbsp;&nbsp;&nbsp;q&nbsp;=&nbsp;deque(itertools.islice(items,&nbsp;size)) &nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;item&nbsp;in&nbsp;items: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;del&nbsp;q[0] &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;q.append(item) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;q如果需要从末尾读取文件,则使用gallop(即指数搜索)。def&nbsp;tail(f,&nbsp;n): &nbsp;&nbsp;&nbsp;&nbsp;assert&nbsp;n&nbsp;>=&nbsp;0 &nbsp;&nbsp;&nbsp;&nbsp;pos,&nbsp;lines&nbsp;=&nbsp;n+1,&nbsp;[] &nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;len(lines)&nbsp;<=&nbsp;n: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.seek(-pos,&nbsp;2) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except&nbsp;IOError: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;f.seek(0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lines&nbsp;=&nbsp;list(f) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos&nbsp;*=&nbsp;2 &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;lines[-n:]
打开App,查看更多内容
随时随地看视频慕课网APP