Ich habe eine Anwendung, die Zeilen aus einer Datei liest und ihre Magie in jeder Zeile ausgibt, während sie gelesen wird. Sobald die Zeile gelesen und ordnungsgemäß verarbeitet wurde, möchte ich die Zeile aus der Datei löschen. Ein Backup der entfernten Zeile wird bereits durchgeführt. Ich möchte etwas wie
machen %Vor%Das scheint ein einfaches Problem zu sein, aber ich würde es lieber richtig machen als eine ganze Menge komplizierter Such- () und Tell () -Aufrufe.
Vielleicht möchte ich wirklich nur eine bestimmte Zeile aus einer Datei entfernen.
Nachdem ich viel zu lange mit diesem Problem verbracht hatte, entschied ich, dass wahrscheinlich jeder Recht hatte, und das war einfach kein guter Weg, etwas zu tun. Es schien einfach so elegante Lösung. Nach was ich suchte, war etwas, das einem FIFO ähnlich ist, der mich Linien gerade aus einer Datei herauspoppen lassen würde.
Im Allgemeinen, wie andere Leute bereits sagten, ist es eine schlechte Idee, was Sie versuchen zu tun.
Sie können nicht . Dies ist mit tatsächlichen Textdateiimplementierungen auf aktuellen Dateisystemen nicht möglich.
Textdateien sind sequenziell, da die Zeilen in einer Textdatei beliebig lang sein können. Das Löschen einer bestimmten Zeile würde bedeuten, die gesamte Datei von diesem Punkt an neu zu schreiben.
Angenommen, Sie haben eine Datei mit den folgenden drei Zeilen:
%Vor%Um die zweite Zeile zu löschen, müssen Sie die Positionen der dritten und vierten Zeile auf der Festplatte verschieben. Der einzige Weg wäre, die dritte und vierte Zeile irgendwo zu speichern, die Datei in der zweiten Zeile abzuschneiden und die fehlenden Zeilen neu zu schreiben.
Wenn Sie die Größe jeder Zeile in der Textdatei kennen, können Sie die Datei in jeder Position mit .truncate(line_size * line_number)
abschneiden, aber selbst dann müssten Sie alles nach der Zeile neu schreiben.
Das Abschneiden der Datei beim Lesen scheint etwas extrem zu sein. Was ist, wenn Ihr Skript einen Fehler hat, der keinen Fehler verursacht? In diesem Fall sollten Sie am Anfang der Datei neu starten.
Wie wäre es, wenn Ihr Skript die Zeilennummer, die es unterbricht, ausgibt und eine Zeilennummer als Parameter verwendet, damit Sie ihm sagen können, von welcher Zeile aus die Verarbeitung beginnen soll?
Zunächst ist es wahrscheinlich nicht die beste Wahl, die Operation truncate
aufzurufen. Wenn ich das Problem richtig verstehe, möchten Sie alles bis zur aktuellen Position in der Datei löschen. (Ich würde erwarten, dass truncate
alles von der aktuellen Position bis zum Ende der Datei schneidet. So funktioniert die standardmäßige Python truncate
-Methode, zumindest wenn ich richtig gegooglet habe.)
Zweitens bin ich mir nicht sicher, ob es sinnvoll ist, die Datei zu ändern, während ich mit der for
-Schleife fortfahre. Wäre es nicht besser, die Anzahl der verarbeiteten Zeilen zu speichern und sie zu löschen, nachdem die Hauptschleife beendet ist, Ausnahme oder nicht? Der Datei-Iterator unterstützt die direkte Filterung , was bedeutet, dass es ziemlich einfach sein sollte, die verarbeiteten Zeilen anschließend zu löschen.
P.S. Ich kenne Python nicht, nehmen Sie das mit einem Körnchen Salz.
Ein verwandter Beitrag hat, was scheint eine gute Strategie, das zu tun, zu sehen Wie kann ich den ersten Prozess aus einer Liste von Prozessen ausführen, die in einer Datei gespeichert sind, und sofort die erste Zeile löschen, als wäre die Datei eine Warteschlange und ich rief" pop "?
Ich habe es wie folgt benutzt:
%Vor%Ich bin nicht sicher, dass es unter Windows funktioniert. Versuchte es auf einem Mac und es hat den Trick gemacht.
Dies ist, was ich für dateibasierte Warteschlangen verwende. Es gibt die erste Zeile zurück und schreibt die Datei mit dem Rest neu. Wenn es fertig ist, gibt es None zurück:
%Vor%