Obtenha as últimas n linhas de um arquivo, semelhante ao tail

| | | | | | | | | | |

Estou escrevendo um visualizador de arquivo de log para um aplicativo da Web e, para isso, quero paginar as linhas do arquivo de log. Os itens no arquivo são baseados em linha com o item mais recente na parte inferior.

Então, eu preciso de um método tail() que possa ler n linhas a partir da parte inferior e suportar um deslocamento. Isso é o que eu inventei:

def tail(f, n, offset=0): """Lê uma linha de f com um deslocamento de linhas de deslocamento.""" avg_line_length = 74 to_read = n + deslocamento while 1: tente: f.seek(-(avg_line_length * to_read), 2) exceto IOError: # woops. aparentemente o arquivo é menor do que o que queremos # para voltar, vá para o início f.seek(0) pos = f.tell() lines = f.read().splitlines() if len(lines) >= to_read ou pos == 0: retorna linhas[-to_read:offset e -offset ou None] avg_line_length *= 1.3 

Essa é uma abordagem razoável? Qual é a maneira recomendada de encerrar arquivos de log com deslocamentos?