Python schneidet Zeilen ab, während sie gelesen werden

8

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.

    
Ryan White 08.02.2009, 06:34
quelle

7 Antworten

13

Entferne alle Zeilen, nachdem du sie erledigt hast:

%Vor%

Entferne jede Zeile unabhängig:

%Vor%

Sie können nur die Zeilen zurücklassen, die Ausnahmen verursachen:

%Vor%

Im Allgemeinen, wie andere Leute bereits sagten, ist es eine schlechte Idee, was Sie versuchen zu tun.

    
jfs 08.02.2009, 07:08
quelle
8

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.

    
nosklo 08.02.2009 09:25
quelle
6

Sie sollten besser einen Index in der Datei behalten, damit Sie dort beginnen können, wo Sie zuletzt gestoppt haben, ohne einen Teil der Datei zu zerstören. So etwas würde funktionieren:

%Vor%     
sykora 08.02.2009 06:55
quelle
4

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?

    
Imran 08.02.2009 06:47
quelle
4

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.

    
zoul 08.02.2009 06:54
quelle
2

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.

    
gvrocha 13.05.2010 13:56
quelle
1

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%     
Matt Kraemer 15.03.2017 21:14
quelle

Tags und Links