Ich habe dies nicht an einer großen Datei versucht, um zu sehen, wie schnell es ist, aber es sollte ziemlich schnell sein.
So verwenden Sie das Skript zum Entfernen von Zeilen am Ende einer Datei:
./shorten.py 2 large_file.txt
Es sucht bis zum Ende der Datei, prüft, ob das letzte Zeichen ein Zeilenumbruch ist, liest dann jedes Zeichen einzeln und rückwärts, bis es drei Zeilenumbrüche gefunden hat, und schneidet die Datei unmittelbar nach diesem Punkt ab. Die Änderung wird vorgenommen.
Edit: Ich habe unten eine Python 2.4 Version hinzugefügt.
Hier ist eine Version für Python 2.5 / 2.6:
#!/usr/bin/env python2.5 from __future__ import with_statement # also tested with Python 2.6 import os, sys if len(sys.argv) != 3: print sys.argv[0] + ": Invalid number of arguments." print "Usage: " + sys.argv[0] + " linecount filename" print "to remove linecount lines from the end of the file" exit(2) number = int(sys.argv[1]) file = sys.argv[2] count = 0 with open(file,'r+b') as f: f.seek(0, os.SEEK_END) end = f.tell() while f.tell() > 0: f.seek(-1, os.SEEK_CUR) char = f.read(1) if char != '\n' and f.tell() == end: print "No change: file does not end with a newline" exit(1) if char == '\n': count += 1 if count == number + 1: f.truncate() print "Removed " + str(number) + " lines from end of file" exit(0) f.seek(-1, os.SEEK_CUR) if count < number + 1: print "No change: requested removal would leave empty file" exit(3)
Hier ist eine Python 3-Version:
#!/usr/bin/env python3.0 import os, sys if len(sys.argv) != 3: print(sys.argv[0] + ": Invalid number of arguments.") print ("Usage: " + sys.argv[0] + " linecount filename") print ("to remove linecount lines from the end of the file") exit(2) number = int(sys.argv[1]) file = sys.argv[2] count = 0 with open(file,'r+b', buffering=0) as f: f.seek(0, os.SEEK_END) end = f.tell() while f.tell() > 0: f.seek(-1, os.SEEK_CUR) print(f.tell()) char = f.read(1) if char != b'\n' and f.tell() == end: print ("No change: file does not end with a newline") exit(1) if char == b'\n': count += 1 if count == number + 1: f.truncate() print ("Removed " + str(number) + " lines from end of file") exit(0) f.seek(-1, os.SEEK_CUR) if count < number + 1: print("No change: requested removal would leave empty file") exit(3)
Hier ist eine Python 2.4 Version:
#!/usr/bin/env python2.4 import sys if len(sys.argv) != 3: print sys.argv[0] + ": Invalid number of arguments." print "Usage: " + sys.argv[0] + " linecount filename" print "to remove linecount lines from the end of the file" sys.exit(2) number = int(sys.argv[1]) file = sys.argv[2] count = 0 SEEK_CUR = 1 SEEK_END = 2 f = open(file,'r+b') f.seek(0, SEEK_END) end = f.tell() while f.tell() > 0: f.seek(-1, SEEK_CUR) char = f.read(1) if char != '\n' and f.tell() == end: print "No change: file does not end with a newline" f.close() sys.exit(1) if char == '\n': count += 1 if count == number + 1: f.truncate() print "Removed " + str(number) + " lines from end of file" f.close() sys.exit(0) f.seek(-1, SEEK_CUR) if count < number + 1: print "No change: requested removal would leave empty file" f.close() sys.exit(3)