Datei zum Lesen / Schreiben öffnen, bei Bedarf erstellen

8

Was ist der eleganteste Weg, um eine Datei so zu öffnen, dass

  • Die Datei wird erstellt, wenn sie nicht existiert,
  • Die Datei wird nicht abgeschnitten, wenn sie existiert und
  • ist es möglich, einen Teil der Datei (nach dem Suchen) zu schreiben, nicht nur das Ende?

Soweit ich das beurteilen kann, scheint das open builtin nicht auf Zur Aufgabe: Es stellt verschiedene Modi zur Verfügung, aber jeder, den ich ausprobiert habe, erfüllt zumindest eine meiner Anforderungen nicht:

  • r+ schlägt fehl, wenn die Datei nicht existiert.
  • w+ schneidet die Datei ab und verliert dabei vorhandenen Inhalt.
  • a+ erzwingt, dass alle Schreibvorgänge bis zum Ende der Datei gehen, zumindest auf meinem OS X.

Es ist ein schlechtes Gefühl, vor dem Öffnen der Datei zu suchen, da es Platz für die Rennbedingungen lässt. Dasselbe gilt für das Wiederholen des Öffnens mit einem anderen Modus innerhalb eines Ausnahmebehandlers. Ich hoffe, es gibt einen besseren Weg.

    
MvG 03.03.2014, 08:50
quelle

4 Antworten

9

Sie müssen os.open() verwenden, um es auf einer niedrigeren Ebene in zu öffnen das Betriebssystem als open() erlaubt. Insbesondere sollte os.RDWR | os.O_CREAT als flags übergeben werden, was Sie wollen. Details finden Sie auf der Manpage open(2) . Sie können die zurückgegebene FD dann an os.fdopen() übergeben, um ein Dateiobjekt daraus zu erhalten .

    
Ignacio Vazquez-Abrams 03.03.2014, 08:56
quelle
2

Wenn Sie Python 3.3+ verwenden, können Sie x mode (exklusiver Erstellungsmodus) verwenden:

%Vor%

Erhöht FileExistsError , wenn die Datei bereits existiert.

    
falsetru 03.03.2014 08:56
quelle
0

Ich könnte mich irren, aber ich nehme nicht an, dass es eine Race Condition geben wird, wenn es nicht mehrere Threads gibt und die try und except Blöcke der gleiche Thread sind? (Ist es tatsächlich möglich, mehrere Threads zu tun?)

Dies sollte der Aufgabe entsprechen.

%Vor%     
Guy 03.03.2014 08:55
quelle
0

Ich hatte ein ähnliches Problem, als ich versuchte, Elemente in einer Datei als Wörterbuch abzulegen. Allerdings importierte ich Json, Ссылка das hier, vielleicht sehr hilfreich. Denken Sie daran, Json zu importieren. Dies wird die Grundlage für das Dump und das Laden von Daten bei Bedarf sein. In diesem Fall lade ich Informationen in ein leeres Wörterbuch ein und lade sie dort. Die Methode try and exc ist sehr nützlich, wenn Sie ein leeres Wörterbuch verwenden möchten. Ich finde "r +" am nützlichsten, da es die Datei liest und schreibt.

%Vor%     
MartianE 03.03.2014 13:53
quelle

Tags und Links