Das Schreiben in eine Datei in Python fügt Nullbytes ein

8

Ich schreibe ein Todo-Listen-Programm. Es speichert eine Datei mit einer Aufgabe pro Zeile und lässt den Benutzer Elemente hinzufügen oder löschen. Das Problem besteht darin, dass ich aus irgendeinem Grund am Anfang der Datei eine Menge von Null Bytes habe, obwohl das Element korrekt gelöscht wurde. Ich werde dir ein paar Screenshots zeigen, damit ich mich klar mache.

Dies ist die Datei in Notepad ++, bevor Sie das Programm ausführen:

Normale ToDo-Liste http://img683.imageshack.us/img683/2812/beforew.png

Dies ist die Datei nach dem Löschen von Punkt 3 (Zählung von 1):

Punkt 3 ist weg, aber es gibt NUL-Bytes http://img190.imageshack.us/img190/9387 /afterj.png

Dies ist der relevante Code. Das eigentliche Programm ist größer, aber das Ausführen nur dieses Teils löst den Fehler aus.

%Vor%

Könnten Sie bitte darauf hinweisen, wo der Fehler ist?

    
Javier 12.06.2010, 22:32
quelle

3 Antworten

9

Es sieht so aus, als würden Sie Ihren Datenstrom zurückspulen. Fügen Sie nach f.truncate(0) f.seek(0) hinzu. Ansonsten denke ich, dass dein nächster Schreibvorgang an der Stelle beginnen wird, von der du aufgehört hast, und leere Bytes auf seinem Weg dorthin ausfüllen.

(Beachten Sie, dass die Anzahl der Nullzeichen in Ihrem Beispiel der Anzahl der Zeichen in Ihren gelöschten Zeilen sowie einem Wagenrücklauf- und Zeilenvorschubzeichen für jeden einzelnen Buchstaben entspricht.)

    
ʇsәɹoɈ 12.06.2010, 22:38
quelle
6

Aus dem Python-Handbuch :

  

file.truncate([size])
  Kürzen Sie die Dateigröße. Wenn das optionale size Argument vorhanden ist, wird die Datei auf (höchstens) diese Größe abgeschnitten. Die Größe entspricht standardmäßig der aktuellen Position. Die aktuelle Dateiposition wird nicht geändert. Beachten Sie, dass das Ergebnis plattformabhängig ist, wenn die angegebene Größe die aktuelle Größe der Datei überschreitet: Es kann sein, dass die Datei unverändert bleibt und wie angegeben auf die angegebene Größe erhöht wird Nullen oder auf die angegebene Größe mit undefiniertem neuen Inhalt erhöhen. Verfügbarkeit: Windows, viele Unix-Varianten.

Sie schneiden die Datei ab und schreiben item1 und item2 am vorherigen Ende der Datei. Alles davor wird mit 0 Bytes aufgefüllt.

%Vor%

Rufen Sie dies auf, um die Dateiposition nach dem Abschneiden zurückzusetzen.

    
John Kugelman 12.06.2010 22:39
quelle
3

Nimm den Hinweis. Tun Sie das nicht.

In den alten Tagen (vor 30 Jahren - ernsthaft) "aktualisierten" wir Dateien mit komplexer Logik zum Hinzufügen / Ändern / Löschen.

Heutzutage ist das Leben einfacher, wenn Sie Programme schreiben, die

  1. Lesen Sie die gesamte Datei in den Speicher.

  2. Arbeiten Sie an den Objekten im Speicher.

  3. Schreiben Sie die Objekte regelmäßig in eine Datei und wenn der Benutzer speichern möchte.

Es ist schneller und einfacher. Verwenden Sie pickle , um Ihre Objekte in einer Datei abzulegen. Verwechseln Sie nicht "Aufzeichnungen" oder irgendeinen Versuch, eine Datei "an Ort und Stelle" zu ändern.

Wenn Sie wirklich glauben, dass Sie SQL-Funktionen benötigen (Einfügen, Aktualisieren, Löschen), verwenden Sie SQLite. Es ist zuverlässiger als das, was Sie zu tun versuchen.

    
S.Lott 12.06.2010 23:06
quelle

Tags und Links