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+
?
Antworten:
Angenommen, Sie öffnen die Datei mit einer
with
Anweisung, wie Sie es sollten. Dann würden Sie so etwas tun, um aus Ihrer Datei zu lesen: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.quelle
w+
"die vorhandene Datei überschrieben wird, wenn die Datei vorhanden ist". Sobald Sie also eine Datei mit öffnenw+
, 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 warenw+
. Wenn Sie die vorherigen Daten tatsächlich lesen und ergänzen möchten, sollten Sier+
stattdessen verwendenw+
.Hier ist eine Liste der verschiedenen Modi zum Öffnen einer Datei:
r
rb
r +
rb +
w
wb
w +
wb +
ein
ab
a +
ab +
quelle
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.r
,,w
odera
sind exklusiv, können aberb
wie möglich zu jedem von diesen hinzugefügt werden+
, oderU
... Es ist eine kombinatorische Explosion.rb
ist 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#openAlle Dateimodi in Python
r
zum Lesenr+
öffnet zum Lesen und Schreiben (kann eine Datei nicht abschneiden)w
zum Schreibenw+
zum Schreiben und Lesen (kann eine Datei abschneiden)rb
zum Lesen einer Binärdatei. Der Dateizeiger befindet sich am Anfang der Datei.rb+
Lesen oder Schreiben einer Binärdateiwb+
Schreiben einer Binärdateia+
wird zum Anhängen geöffnetab+
Ö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)quelle
rb
undwb
ganz zu schweigen von denU
Modi in 2.x und demt
Modus in 3.x (die beide mit allem außer kombiniert werden könnenb
).wb+
liest sie beispielsweise auch aus der Datei?r
zum lesenw
zum schreibenr+
Zum Lesen / Schreiben, ohne den ursprünglichen Inhalt zu löschen, falls eine Datei vorhanden ist, andernfalls wird eine Ausnahme ausgelöstw+
Um den ursprünglichen Inhalt zu löschen, lesen / schreiben Sie, wenn eine Datei vorhanden ist. Andernfalls erstellen Sie die DateiBeispielsweise,
quelle
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.quelle
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:
Hoffe das hilft..
quelle
r+
Tatsächlich stimmen alle anderen Antworten zum
r+
Modus nicht.test.in
Inhalt der Datei:Und das Py-Skript:
Führen Sie es aus und der
test.in
Inhalt des wird geändert in:Wenn wir das Skript jedoch ändern zu:
das
test.in
tut auch die respond: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 sindf.write(write_content)
, wird der write_content sie von der Position (0,0) abdecken.quelle
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.
quelle