Holen Sie sich die letzten n Zeilen einer Datei mit Python, ähnlich wie tail

Ich schreibe einen Protokolldatei-Viewer für eine Webanwendung und möchte dazu die Zeilen der Protokolldatei durchblättern. Die Elemente in der Datei basieren auf der Zeile mit dem neuesten Element am unteren Rand.

Also brauche ich einetail() Methode, die lesen kannn Zeilen von unten und unterstützt einen Versatz. Was ich mir ausgedacht habe, sieht so aus:

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

Ist das ein vernünftiger Ansatz? Wie werden Protokolldateien mit Offsets empfohlen?

Antworten auf die Frage(29)

Ihre Antwort auf die Frage