Schreibt Pythons Schreibmodus zum Anhängen von Dateien nur neue Bytes oder schreibt er auch die gesamte Datei neu?

Nov 29 2020

Obwohl ich mir vorstellen würde, dass der Append-Modus "intelligent" genug ist, um nur die neuen angehängten Bytes einzufügen, möchte ich unbedingt sicherstellen, dass Python nicht damit umgeht, indem ich die gesamte Datei zusammen mit den neuen Bytes neu schreibe.

Ich versuche, eine laufende Sicherung eines Programmprotokolls zu erstellen, und es könnte mehrere tausend Datensätze in einem CSV-Format erreichen.

Antworten

2 Vlad Nov 30 2020 at 03:31

Python-Dateioperationen sind Convenience-Wrapper gegenüber Betriebssystemdateivorgängen. Das Betriebssystem implementiert diese Dateisystemoperationen entweder intern und leitet sie an ein ladbares Modul (Plugin) oder einen externen Server (NFS, SMB) weiter. Die meisten Betriebssysteme seit 1971 können Daten an die vorhandene Datei anhängen. Zumindest alle, die behaupten, auch nur aus der Ferne POSIX-konform zu sein.

Der POSIX-Anhänge-Modus öffnet einfach die Datei zum Schreiben und bewegt den Dateizeiger an das Ende der Datei. Dies bedeutet, dass alle Schreibvorgänge nur über das Ende der Datei hinaus schreiben.

Es kann einige Ausnahmen geben, zum Beispiel kann eine Routine Systemaufrufe auf niedriger Ebene verwenden, um den Dateizeiger rückwärts zu bewegen. Oder das zugrunde liegende Dateisystem ist möglicherweise nicht POSIX-kompatibel und verwendet eine Art Objekttransaktionsspeicher wie AWS S3. Aber für jedes Standardszenario würde ich mir über solche Fälle keine Sorgen machen.

Da Sie jedoch Backup als Anwendungsfall angegeben haben, müssen Sie besonders vorsichtig sein. Backups sind nicht so einfach, wie es auf den ersten Blick scheint. Dinge, über die man sich Sorgen machen muss, verschiedene Caches, die möglicherweise Daten im Speicher speichern, bevor sie auf die Festplatte geschrieben werden. Was passiert, wenn der Strom direkt nach dem Anhängen neuer Datensätze ausfällt? Was passiert auch, wenn jemand mehrere Kopien Ihres Programms startet?

Und das Letzte. Wenn Sie nicht auf einem 8-Bit-Computer aus den 1980er Jahren arbeiten, sind ein paar tausend CSV-Leitungen nichts für die moderne Hardware. Selbst wenn die Dateien geladen und zurückgeschrieben werden, werden Sie keinen Unterschied bemerken