Der Versuch, die letzten n Zeilen einer Datei zu lesen, ist eine häufige Anforderung, die an tail -n erinnert Befehl in Unix-ähnlichen Systemen. Um dies zu erreichen, müssen wir eine effiziente Methode finden, die diese Funktionalität bereitstellen kann.
Ein vorgeschlagener Ansatz besteht darin, eine durchschnittliche Zeilenlänge zu schätzen und diese schrittweise zu erhöhen, bis sie ausreichend ist Anzahl der gelesenen Zeilen. Diese Methode ist zwar sinnvoll, basiert jedoch auf der Schätzung der Zeilenlänge und kann in bestimmten Szenarien eine schlechtere Leistung erbringen.
Eine robustere alternative Methode besteht darin, die Datei in Blöcken zu durchlaufen. Die Blockgröße kann für eine optimale Leistung angepasst werden, und die Methode basiert nicht auf Annahmen über die Zeilenlänge. Es werden weiterhin Blöcke gelesen, bis die Gesamtzahl der gewünschten Zeilen erreicht ist. Diese Technik gewährleistet eine konsistente und zuverlässige Leistung über verschiedene Dateigrößen und Zeilenlängen hinweg.
Bei der Verwendung dieser blockbasierten Methode ist es wichtig, die Dateigröße im Verhältnis zur Systemgröße zu berücksichtigen Blockgröße des Betriebssystems. Wenn die Datei kleiner als ein einzelner Betriebssystemblock ist, kann die Methode zu redundanten Lesevorgängen und einer geringeren Leistung führen. In solchen Fällen kann die Anpassung der Blockgröße an die Blockgröße des Betriebssystems zu Verbesserungen führen. Bei großen Dateien hat diese Optimierung jedoch möglicherweise keine wesentlichen Auswirkungen.
Der vorgeschlagene alternative Ansatz kann wie folgt in Python implementiert werden:
def tail(f, lines=20): """Reads the last n lines from a file.""" BLOCK_SIZE = 1024 f.seek(0, 2) block_end_byte = f.tell() lines_to_go = lines 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(b'\n') # Edit for Python 3.2 and up lines_to_go -= lines_found block_end_byte -= BLOCK_SIZE block_number -= 1 all_read_text = b''.join(reversed(blocks)) # Edit for Python 3.2 and up return b'\n'.join(all_read_text.splitlines()[-lines:]) # Edit for Python 3.2 and up
Diese Implementierung ermöglicht die Angabe der Anzahl der zu lesenden Zeilen und macht sie zu einer flexiblen und vielseitigen Lösung. Es priorisiert Robustheit und Leistung und vermeidet Annahmen über Zeilenlänge oder Dateigröße.
Das obige ist der detaillierte Inhalt vonWie kann ich die letzten N Zeilen einer Datei in Python effizient lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!