Unterschied zwischen den Modi a, a +, w, w + und r + in der eingebauten offenen Funktion?

610

In dem Python eingebauten in offener Funktion, was ist der genaue Unterschied zwischen den Modi w, a, w+, a+und r+?

Insbesondere impliziert die Dokumentation, dass all dies das Schreiben in die Datei ermöglicht, und besagt, dass die Dateien speziell zum "Anhängen", "Schreiben" und "Aktualisieren" geöffnet werden, definiert jedoch nicht, was diese Begriffe bedeuten.

Flybywire
quelle
11
Der von Ihnen angegebene Link definiert die Werte genau. Welchen Teil des von Ihnen bereitgestellten Links konnten Sie nicht sehen oder verstehen? Könnten Sie Ihre Frage klären, um zu erklären, was Sie über den Link nicht verstanden haben?
S.Lott
@ ChrisB. - Ich habe dies als Fehler unter bugs.python.org/issue19627 gemeldet
Bulwersator
2
Gibt es kein einfaches und einzelnes Dokument, das erklärt, was das + -Zeichen bedeutet?
Charlie Parker

Antworten:

740

Die Öffnungsmodi sind genau die gleichen wie für die C-Standardbibliotheksfunktion fopen() .

Die BSD- fopenManpage definiert sie wie folgt:

 The argument mode points to a string beginning with one of the following
 sequences (Additional characters may follow these sequences.):

 ``r''   Open text file for reading.  The stream is positioned at the
         beginning of the file.

 ``r+''  Open for reading and writing.  The stream is positioned at the
         beginning of the file.

 ``w''   Truncate file to zero length or create text file for writing.
         The stream is positioned at the beginning of the file.

 ``w+''  Open for reading and writing.  The file is created if it does not
         exist, otherwise it is truncated.  The stream is positioned at
         the beginning of the file.

 ``a''   Open for writing.  The file is created if it does not exist.  The
         stream is positioned at the end of the file.  Subsequent writes
         to the file will always end up at the then current end of file,
         irrespective of any intervening fseek(3) or similar.

 ``a+''  Open for reading and writing.  The file is created if it does not
         exist.  The stream is positioned at the end of the file.  Subse-
         quent writes to the file will always end up at the then current
         end of file, irrespective of any intervening fseek(3) or similar.
drAlberT
quelle
3
Ich glaube, Sie meinen den offenen Aufruf in der C-Standardbibliothek (der kein Systemaufruf ist)
Eli Courtwright
14
HINWEIS: Python v3 fügt eine Reihe zusätzlicher Modi hinzu. Link zu Dokumenten
Alex
5
Festgestellt, dass wund w+beide könnenThe file is created if it does not exist
Wei Yang
4
Unter Windows bauf den Modus angehängt öffnet die Datei im Binär - Modus, so gibt es auch Modi wie rb, wb, und r+b. Python unter Windows unterscheidet zwischen Text- und Binärdateien. Die Zeilenendezeichen in Textdateien werden beim Lesen oder Schreiben von Daten automatisch geringfügig geändert.
6
Habe ich Recht zu sagen, dass das +nicht etwas konsequentes unabhängig macht, wenn es ist a, woder r? Oder sehe ich das Muster nicht? Was ist das Muster?
Charlie Parker
510

Mir ist aufgefallen, dass ich von Zeit zu Zeit wieder von Google öffnen muss, um mir ein Bild von den Hauptunterschieden zwischen den Modi zu machen. Daher dachte ich, dass ein Diagramm beim nächsten Mal schneller zu lesen ist. Vielleicht findet das auch jemand anderes hilfreich.

Andrzej Pronobis
quelle
3
Die aBeschreibung ist falsch . Die Schreibvorgänge werden immer am Ende positioniert.
Antti Haapala
10
@Und ich glaube, @Antti bezieht sich auf die Eigenschaft, Subsequent writes to the file will always end up at the then current end of file, irrespective of any intervening fseek(3) or similardie etwas stärker ist als nur zu sagen, dass die Anfangsposition das Ende ist.
JCai
8
@CharlieParker Dass es grundsätzlich zwei Dateioperationen gibt (Lesen, Schreiben). Der Modus r dient hauptsächlich zum Lesen, die Modi w , a dienen hauptsächlich zum Schreiben. Und das Pluszeichen aktiviert die zweite Operation für einen bestimmten Modus (einfach gesagt).
Jeyekomon
22
Für die Nachwelt: Abschneiden bedeutet, von Anfang an zu überschreiben.
Minh Tran
4
@Jeyekomon Ihre Zusammenfassung in Ihrem Kommentar hier ist wahrscheinlich DIE hilfreichste Sache, die ich gelesen habe, um mich auf eine Weise mit diesen Modi vertraut zu machen, an die ich mich jetzt erinnern kann! Das Flussdiagramm in dieser Antwort ist wunderschön und die Tabelle in der Antwort unten ist großartig. Wenn diese Antworten (und andere an anderer Stelle) mit diesem einfachen Punkt beginnen und von dort aus funktionieren würden, würde dies dazu beitragen, einen viel besseren mentalen Rahmen zum Aufhängen der Details bereitzustellen auf. So danke. (Ich bin mir bewusst, dass dies vielleicht an der Grenze zu Spam liegt, aber ich hatte das Gefühl, dass Ihr Kommentar Anerkennung verdient) 💯
Tim
206

Gleiche Infos, nur in Tabellenform

                  | r   r+   w   w+   a   a+
------------------|--------------------------
read              | +   +        +        +
write             |     +    +   +    +   +
write after seek  |     +    +   +
create            |          +   +    +   +
truncate          |          +   +
position at start | +   +    +   +
position at end   |                   +   +

wo Bedeutungen sind: (nur um Fehlinterpretationen zu vermeiden)

  • Lesen - Lesen aus einer Datei ist zulässig
  • Schreiben - Schreiben in eine Datei ist erlaubt

  • create - Datei wird erstellt, wenn sie noch nicht vorhanden ist

  • trunctate - beim Öffnen der Datei wird sie leer gemacht (der gesamte Inhalt der Datei wird gelöscht)

  • Position beim Start - Nach dem Öffnen der Datei wird die Anfangsposition auf den Anfang der Datei gesetzt

  • Position am Ende - Nach dem Öffnen der Datei wird die Anfangsposition auf das Ende der Datei gesetzt

Hinweis: aund a+immer an das Ende der Datei anhängen - ignoriert alle seekBewegungen.
Übrigens. interessantes Verhalten zumindest auf meinem win7 / python2.7 für neue Datei im a+Modus geöffnet :
write('aa'); seek(0, 0); read(1); write('b')- Sekunde writewird ignoriert
write('aa'); seek(0, 0); read(2); write('b')- Sekunde writeerhöhtIOError

Industriearbeiter3595112
quelle
10
Warum gibt es kein "Datei erstellen, wenn es nicht existiert. Wenn es existiert, am Start positionieren, Lesen und Schreiben aktivieren"? Dies ist für mich der offensichtlichste Anwendungsfall: Ich speichere Daten in einer Datei. Wenn die Datei nicht vorhanden ist, erstellen Sie sie anstelle eines Fehlers. Wenn die Datei Daten enthält, die ich von oben lesen möchte, aktualisieren Sie einige Daten und schreiben Sie die Datei für das NÄCHSTE MAL, in dem ich sie lade, vollständig von 0 neu. Ich benutze open(file,'a'); close(); open(file,'r+'), um dies zu erreichen.
Stecknadelkopf
2
Was bedeutet "Abschneiden" in diesem Zusammenhang?
Charlie Parker
3
@CharlieParker Es bedeutet, dass der gesamte Inhalt der Datei gelöscht wird (Datei wird leer gemacht)
Industryworker3595112
1
Möglicherweise möchten Sie eine Notiz hinzufügen, die mit aund a+Schreibvorgänge immer am Ende der Datei ausgeführt wird, unabhängig davon, ob der Zeiger manuell mit verschoben wird seek().
Balu
1
Was ist mit der Aktualisierung der Tabelle, um 'x' für Python 3 aufzunehmen?
Nikos Alexandris
39

Die Optionen sind dieselben wie für die Funktion fopen in der C-Standardbibliothek:

w schneidet die Datei ab und überschreibt alles, was bereits vorhanden war

a wird an die Datei angehängt und zu dem hinzugefügt, was bereits vorhanden war

w+ Wird zum Lesen und Schreiben geöffnet, wobei die Datei abgeschnitten wird, aber Sie können auch zurücklesen, was in die Datei geschrieben wurde

a+ Wird zum Anhängen und Lesen geöffnet, sodass Sie sowohl an die Datei anhängen als auch deren Inhalt lesen können

Eli Courtwright
quelle
2
Was bedeutet "Abschneiden" in diesem Zusammenhang? Bedeutet es, die alten Daten zu löschen, wenn es welche gab? Oder etwas anderes Spezifischeres?
Charlie Parker
3
@CharlieParker: Richtig - Dies bedeutet, dass alle Daten in der vorhandenen Datei gelöscht werden und wir mit dem Schreiben einer jetzt leeren Datei beginnen.
Eli Courtwright
9

Ich denke, dies ist wichtig für die plattformübergreifende Ausführung, dh als CYA. :) :)

Unter Windows öffnet 'b', das an den Modus angehängt ist, die Datei im Binärmodus, daher gibt es auch Modi wie 'rb', 'wb' und 'r + b'. Python unter Windows unterscheidet zwischen Text- und Binärdateien. Die Zeilenendezeichen in Textdateien werden beim Lesen oder Schreiben von Daten automatisch geringfügig geändert. Diese Änderung der Dateidaten hinter den Kulissen ist für ASCII-Textdateien in Ordnung, beschädigt jedoch Binärdaten wie die in JPEG- oder EXE-Dateien. Achten Sie beim Lesen und Schreiben solcher Dateien sehr darauf, den Binärmodus zu verwenden. Unter Unix schadet es nicht, ein 'b' an den Modus anzuhängen, sodass Sie es plattformunabhängig für alle Binärdateien verwenden können.

Dies wird direkt aus Python Software Foundation 2.7.x zitiert .

Goran B.
quelle
9

Ich bin darauf gestoßen, um herauszufinden, warum Sie den Modus 'w +' gegen 'w' verwenden würden. Am Ende habe ich nur ein paar Tests gemacht. Ich sehe nicht viel Sinn für den Modus 'w +', da in beiden Fällen die Datei zunächst abgeschnitten wird. Mit dem 'w +' können Sie jedoch nach dem Schreiben lesen, indem Sie zurück suchen. Wenn Sie versuchen, mit 'w' zu lesen, wird ein IOError ausgelöst. Das Lesen ohne Verwendung der Suche mit dem Modus 'w +' bringt nichts, da der Dateizeiger hinter dem Punkt steht, an dem Sie geschrieben haben.

Wyrmwood
quelle