Verwirrt durch den Python-Dateimodus "w +"

200

Aus dem Dokument ,

Die Modi 'r +', 'w +' und 'a +' öffnen die Datei zum Aktualisieren (beachten Sie, dass 'w +' die Datei abschneidet). Fügen Sie 'b' an den Modus an, um die Datei im Binärmodus auf Systemen zu öffnen, die zwischen Binär- und Textdateien unterscheiden. Auf Systemen ohne diese Unterscheidung hat das Hinzufügen des 'b' keine Auswirkung.

und hier

w +: Öffnet eine Datei zum Schreiben und Lesen. Überschreibt die vorhandene Datei, wenn die Datei vorhanden ist. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Lesen und Schreiben erstellt.

Aber wie liest man eine geöffnete Datei w+?

Heilige
quelle
27
Ich fand dieses Diagramm sehr nützlich.
Ritwik

Antworten:

132

Angenommen, Sie öffnen die Datei mit einer withAnweisung, wie Sie es sollten. Dann würden Sie so etwas tun, um aus Ihrer Datei zu lesen:

with open('somefile.txt', 'w+') as f:
    # Note that f has now been truncated to 0 bytes, so you'll only
    # be able to read data that you write after this point
    f.write('somedata\n')
    f.seek(0)  # Important: return to the top of the file before reading, otherwise you'll just read an empty string
    data = f.read() # Returns 'somedata\n'

Beachten f.seek(0)Sie Folgendes: Wenn Sie dies vergessen, f.read()versucht der Aufruf, vom Ende der Datei zu lesen, und gibt eine leere Zeichenfolge zurück.

rmunn
quelle
1
Was bedeutet "Abschneiden auf 0 Bytes"?
Nasif Imtiaz Ohi
22
@NasifImtiazOhi - Die Python-Dokumente sagen, dass w+"die vorhandene Datei überschrieben wird, wenn die Datei vorhanden ist". Sobald Sie also eine Datei mit öffnen w+, handelt es sich um eine leere Datei: Sie enthält 0 Bytes. Wenn es früher Daten enthielt, wurden diese Daten abgeschnitten - abgeschnitten und weggeworfen - und jetzt beträgt die Dateigröße 0 Byte, sodass Sie keine der Daten lesen können, die vor dem Öffnen der Datei mit vorhanden waren w+. Wenn Sie die vorherigen Daten tatsächlich lesen und ergänzen möchten, sollten Sie r+stattdessen verwenden w+.
rmunn
Wie füge ich neue Daten hinzu?
Beqa Bukhradze
1
@BeqaBukhradze - Wenn Sie eine Frage haben, klicken Sie auf die Schaltfläche "Frage stellen", wo sie von Hunderten von Personen gesehen wird. Klicken Sie nicht einfach auf die Schaltfläche "Kommentar hinzufügen", wo nur ein oder zwei Personen ihn sehen.
rmunn
428

Hier ist eine Liste der verschiedenen Modi zum Öffnen einer Datei:

  • r

    Öffnet eine Datei nur zum Lesen. Der Dateizeiger befindet sich am Anfang der Datei. Dies ist der Standardmodus.

  • rb

    Öffnet eine Datei zum Lesen nur im Binärformat. Der Dateizeiger befindet sich am Anfang der Datei. Dies ist der Standardmodus.

  • r +

    Öffnet eine Datei zum Lesen und Schreiben. Der Dateizeiger befindet sich am Anfang der Datei.

  • rb +

    Öffnet eine Datei zum Lesen und Schreiben im Binärformat. Der Dateizeiger befindet sich am Anfang der Datei.

  • w

    Öffnet eine Datei nur zum Schreiben. Überschreibt die Datei, wenn die Datei vorhanden ist. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Schreiben erstellt.

  • wb

    Öffnet eine Datei zum Schreiben nur im Binärformat. Überschreibt die Datei, wenn die Datei vorhanden ist. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Schreiben erstellt.

  • w +

    Öffnet eine Datei zum Schreiben und Lesen. Überschreibt die vorhandene Datei, wenn die Datei vorhanden ist. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Lesen und Schreiben erstellt.

  • wb +

    Öffnet eine Datei zum Schreiben und Lesen im Binärformat. Überschreibt die vorhandene Datei, wenn die Datei vorhanden ist. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Lesen und Schreiben erstellt.

  • ein

    Öffnet eine Datei zum Anhängen. Der Dateizeiger befindet sich am Ende der Datei, wenn die Datei vorhanden ist. Das heißt, die Datei befindet sich im Anhänge-Modus. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Schreiben erstellt.

  • ab

    Öffnet eine Datei zum Anhängen im Binärformat. Der Dateizeiger befindet sich am Ende der Datei, wenn die Datei vorhanden ist. Das heißt, die Datei befindet sich im Anhänge-Modus. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Schreiben erstellt.

  • a +

    Öffnet eine Datei zum Anhängen und Lesen. Der Dateizeiger befindet sich am Ende der Datei, wenn die Datei vorhanden ist. Die Datei wird im Anhänge-Modus geöffnet. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Lesen und Schreiben erstellt.

  • ab +

    Öffnet eine Datei zum Anhängen und Lesen im Binärformat. Der Dateizeiger befindet sich am Ende der Datei, wenn die Datei vorhanden ist. Die Datei wird im Anhänge-Modus geöffnet. Wenn die Datei nicht vorhanden ist, wird eine neue Datei zum Lesen und Schreiben erstellt.

Aufheben
quelle
Also sind r + und w + für alle intensiven Zwecke gleich?
Nick Humrich
21
@Humdinger: Nein, w+erstellt eine neue Datei oder schneidet eine vorhandene Datei ab und öffnet sie dann zum Lesen und Schreiben. r+öffnet eine vorhandene Datei, ohne sie zum Lesen und Schreiben abzuschneiden. Sehr verschieden.
Abarnert
Wie bei der Antwort von @ AlokAgarwal behauptet dies, eine erschöpfende Liste von Modi zu sein, ist es aber nicht.
abarnert
1
Es wäre ziemlich dumm, eine vollständige Liste von Modi anzugeben, da diese eher wie eine Funktion mit mehreren Parametern funktionieren. r,, woder asind exklusiv, können aber bwie möglich zu jedem von diesen hinzugefügt werden +, oder U... Es ist eine kombinatorische Explosion.
rmunn
4
rbist nicht der Standardmodus, Zitat: The most commonly-used values of mode are 'r' for reading, 'w' for writing (truncating the file if it already exists), and 'a' for appending (which on some Unix systems means that all writes append to the end of the file regardless of the current seek position). If mode is omitted, it defaults to 'r' docs.python.org/2/library/functions.html#open
iggy
158

Alle Dateimodi in Python

  • r zum Lesen
  • r+ öffnet zum Lesen und Schreiben (kann eine Datei nicht abschneiden)
  • w zum Schreiben
  • w+ zum Schreiben und Lesen (kann eine Datei abschneiden)
  • rbzum Lesen einer Binärdatei. Der Dateizeiger befindet sich am Anfang der Datei.
  • rb+ Lesen oder Schreiben einer Binärdatei
  • wb+ Schreiben einer Binärdatei
  • a+ wird zum Anhängen geöffnet
  • ab+Öffnet eine Datei zum Anhängen und Lesen in Binärform. Der Dateizeiger befindet sich am Ende der Datei, wenn die Datei vorhanden ist. Die Datei wird im Anhänge-Modus geöffnet.
  • x Offen für exklusive Erstellung, fehlgeschlagen, wenn die Datei bereits vorhanden ist (Python 3)
Alok Agarwal
quelle
5
Dies sind nicht alle Modi. Es vernachlässigt z. B. rbund wbganz zu schweigen von den UModi in 2.x und dem tModus in 3.x (die beide mit allem außer kombiniert werden können b).
Abarnert
1
Der Unterschied zwischen r + und w + besteht darin, dass w + eine Datei beim Öffnen abschneidet. Sie können es jedoch in beiden Modi manuell abschneiden.
Martin
1
Diese Antwort stimmt nicht mit der von @ 200 überein. OK, wb+liest sie beispielsweise auch aus der Datei?
Celeritas
@Celeritas Das wb zeigt an, dass die Datei zum Schreiben im Binärmodus geöffnet ist. Auf Unix-Systemen (Linux, Mac OS X usw.) bewirkt der Binärmodus nichts - sie behandeln Textdateien genauso wie alle anderen Dateien. Unter Windows werden Textdateien jedoch mit leicht geänderten Zeilenenden geschrieben. Dies verursacht ein ernstes Problem beim Umgang mit tatsächlichen Binärdateien wie exe- oder jpg-Dateien. Daher sollten Sie beim Öffnen von Dateien, die auch unter Unix kein Text sein sollen, wb oder rb verwenden. Verwenden Sie nur w oder r nur für Textdateien.
Alok Agarwal
In Python 3 gibt es auch den Öffnungsmodus 'x': Offen für die exklusive Erstellung, fehlgeschlagen, wenn die Datei bereits vorhanden ist. Siehe Öffnungsfunktion im Dokument.
Laurent LAPORTE
9

r zum lesen

w zum schreiben

r+ Zum Lesen / Schreiben, ohne den ursprünglichen Inhalt zu löschen, falls eine Datei vorhanden ist, andernfalls wird eine Ausnahme ausgelöst

w+ Um den ursprünglichen Inhalt zu löschen, lesen / schreiben Sie, wenn eine Datei vorhanden ist. Andernfalls erstellen Sie die Datei

Beispielsweise,

>>> with open("file1.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file1.txt", "w+") as f:
...   f.write("c")
... 

$ cat file1.txt 
c$
>>> with open("file2.txt", "r+") as f:
...   f.write("ab\n")
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: 'file2.txt'

>>> with open("file2.txt", "w") as f:
...   f.write("ab\n")
... 
>>> with open("file2.txt", "r+") as f:
...   f.write("c")
... 

$ cat file2.txt 
cb
$
GraceMeng
quelle
2

Die Datei wird abgeschnitten, so dass Sie können anrufen read()(keine Ausnahmen angehoben, anders als beim Öffnen mit ‚w‘) , aber Sie werden eine leere Zeichenfolge bekommen.

Elazar
quelle
2

Ich vermute, es gibt zwei Möglichkeiten, mit dem umzugehen, was Sie meiner Meinung nach erreichen wollen.

1) was offensichtlich ist, ist, die Datei nur zum Lesen zu öffnen, sie in den Speicher einzulesen, dann die Datei mit t zu öffnen und dann Ihre Änderungen zu schreiben.

2) Verwenden Sie die Routinen zur Dateibehandlung auf niedriger Ebene:

# Open file in RW , create if it doesn't exist. *Don't* pass O_TRUNC
 fd = os.open(filename, os.O_RDWR | os.O_CREAT)

Hoffe das hilft..

Dory Zidon
quelle
Dann was für r+
SmartManoj
1

Tatsächlich stimmen alle anderen Antworten zum r+Modus nicht.

test.in Inhalt der Datei:

hello1
ok2
byebye3

Und das Py-Skript:

with open("test.in", 'r+')as f:
    f.readline()
    f.write("addition")

Führen Sie es aus und der test.inInhalt des wird geändert in:

hello1
ok2
byebye3
addition

Wenn wir das Skript jedoch ändern zu:

with open("test.in", 'r+')as f:
    f.write("addition")

das test.intut auch die respond:

additionk2
byebye3

Der r+Modus ermöglicht es uns also, den Inhalt von Anfang an abzudecken, wenn wir den Lesevorgang nicht ausgeführt haben. Und wenn wir einen Lesevorgang ausführen, f.write()wird nur an die Datei angehängt.

Übrigens, wenn wir f.seek(0,0)vorher sind f.write(write_content), wird der write_content sie von der Position (0,0) abdecken.

Finden
quelle
0

Wie von h4z3 erwähnt , sind Ihre Daten für den praktischen Gebrauch manchmal zu groß, um alles direkt zu laden, oder Sie haben einen Generator oder eingehende Echtzeitdaten. Sie können w + verwenden, um sie in einer Datei zu speichern und später zu lesen.

SmartManoj
quelle