Obtenga las últimas n líneas de un archivo, similar a la cola

| | | | | | | | | | |

Estoy escribiendo un visor de archivos de registro para una aplicación web y para eso quiero paginar las líneas del archivo de registro. Los elementos del archivo se basan en líneas con el elemento más nuevo en la parte inferior.

Así que necesito un método tail() que pueda leer n líneas desde la parte inferior y admita un desplazamiento. Esto es lo que se me ocurrió:

def tail(f, n, offset=0): """Lee una línea de f con un desplazamiento de líneas de desplazamiento.""" avg_line_length = 74 to_read = n + offset while 1: intente: f.seek(-(avg_line_length * to_read), 2) excepto IOError: # woops. aparentemente el archivo es más pequeño de lo que queremos # retroceder, ir al principio en su lugar f.seek(0) pos = f.decir() líneas = f.leer().líneas divididas() si len(líneas) >= para_leer o pos == 0: devolver líneas[-para_leer:desplazamiento y -desplazamiento o Ninguno] avg_line_length *= 1.3 

¿Es este un enfoque razonable? ¿Cuál es la forma recomendada de seguir los archivos de registro con compensaciones?