Einführung
Die Analyse von Protokolldateien erfordert häufig die Fähigkeit dazu die neuesten Einträge anzeigen. Dies wird normalerweise mit dem Befehl „tail“ erreicht, der die letzten n Zeilen einer Datei abruft. In diesem Artikel untersuchen wir eine Implementierung einer Python-Methode, die den tail-Befehl mit Unterstützung für Offsets emuliert.
Tail-Implementierung
Die vorgeschlagene tail()-Methode funktioniert wie folgt:
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: 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
Diese Methode schätzt die durchschnittliche Zeilenlänge und passt sie dynamisch an, um die Leistung zu optimieren.
Alternativer Ansatz
Die ursprüngliche Implementierung geht von Annahmen über die Zeilenlänge aus, die möglicherweise nicht immer zutreffen. Hier ist ein alternativer Ansatz, der solche Annahmen vermeidet:
def tail(f, lines=20): total_lines_wanted = lines BLOCK_SIZE = 1024 f.seek(0, 2) block_end_byte = f.tell() lines_to_go = total_lines_wanted block_number = -1 blocks = [] while lines_to_go > 0 and block_end_byte > 0: if (block_end_byte - BLOCK_SIZE > 0): f.seek(block_number*BLOCK_SIZE, 2) blocks.append(f.read(BLOCK_SIZE)) else: f.seek(0,0) blocks.append(f.read(block_end_byte)) lines_found = blocks[-1].count('\n') lines_to_go -= lines_found block_end_byte -= BLOCK_SIZE block_number -= 1 all_read_text = ''.join(reversed(blocks)) return '\n'.join(all_read_text.splitlines()[-total_lines_wanted:])
Diese Methode durchsucht die Datei Block für Block rückwärts und zählt dabei Zeilenumbrüche, um die gewünschten Zeilen zu finden.
Fazit
Beide Methoden bieten praktikable Lösungen zum Abrufen der letzten n Zeilen einer Datei mit Offset-Unterstützung. Der alternative Ansatz vermeidet Annahmen über die Zeilenlänge und könnte für große Dateien effizienter sein.
Das obige ist der detaillierte Inhalt vonWie kann ich die letzten N Zeilen einer Datei in Python effizient abrufen (mit Offset-Unterstützung)?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!