Wie öffne ich eine Datei zum Lesen und Schreiben?

210

Gibt es eine Möglichkeit, eine Datei zum Lesen und Schreiben zu öffnen?

Um dieses Problem zu umgehen, öffne ich die Datei zum Schreiben, schließe sie und öffne sie dann erneut zum Lesen. Aber gibt es eine Möglichkeit , eine Datei zu öffnen sowohl das Lesen und Schreiben?

Bigredhat
quelle
3
Welches Problem lösen Sie? Vielleicht gibt es eine bessere Lösung als das Schreiben / Lesen einer Datei, zBmmap
Roman Bodnarchuk
1
Könnten Sie uns Ihren Code geben, damit wir Ihnen antworten können? Sie können auch versuchen, einen Blick darauf zu werfen: docs.python.org/tutorial/… . Allerdings habe ich versucht, r + b zu verwenden und es funktioniert. Gibt es auch einen Vorteil bei der Verwendung eines Dateideskriptors in Diff-Funktionen?
Artsiom Rudzenka
@RomanBodnarchuk mmapist eine großartige Idee, aber was ist, wenn Sie mit Parallelität umgehen müssen? Gibt es eine Möglichkeit, den Zugang zu reservieren?
Dr_Zaszuś

Antworten:

267

So lesen Sie eine Datei und schreiben sie dann (überschreiben vorhandener Daten), ohne sie zu schließen und erneut zu öffnen:

with open(filename, "r+") as f:
    data = f.read()
    f.seek(0)
    f.write(output)
    f.truncate()
Flimm
quelle
41
Verwenden Sie a+diese
Option, um den Endfall
16
seek () und truncate () sind beide kritisch!
Smwikipedia
4
@JossefHarush Beachten Sie, dass die Dokumentation für Status a"auf einigen Unix-Systemen bedeutet, dass alle Schreibvorgänge unabhängig von der aktuellen Suchposition an das Ende der Datei angehängt werden ". In diesem Fall f.seek(0)funktioniert das nicht wie erwartet. Ich bin unter Linux einfach schlecht drauf geworden.
Graeme
6
Es ist besser, Sie erklären, warum seekund truncatewird hier verwendet. Die meisten Leser kommen von Google und kopieren und fügen ein.
Shiplu Mokaddim
7
Nachdem Sie die Datei gelesen haben, wurde der Dateizeiger (fp) vorwärts bewegt, sodass Sie ihn auf den Anfang setzen müssen. Das ist es, was es seek(0)tut: Es platziert den fp an der Position 0( dh am Anfang). truncate()Schneiden Sie die Datei auf die angegebene Anzahl von Bytes ab, dh entfernen Sie den gesamten Dateiinhalt nach der angegebenen Anzahl von Bytes. Stellen Sie sich vor, Ihre Datei enthält die Zeichenfolge Hello, worldund Sie schreiben Bye. Wenn Sie dies nicht tun, wird truncate()der Inhalt am Ende angezeigt Byelo, world, da Sie den in der Datei vorhandenen Text nie gelöscht haben. truncate()schneidet die Datei auf den aktuellen fp ab.
Illya Gerasymchuk
48

r+ist der kanonische Modus zum gleichzeitigen Lesen und Schreiben. Dies unterscheidet sich nicht von der Verwendung des fopen()Systemaufrufs, da file()/ open()nur ein winziger Wrapper um diesen Betriebssystemaufruf ist.

Andreas Jung
quelle
es hängt Dateiinhalt an, nicht von Anfang an schreiben
TomSawyer
47

Fassen Sie das E / A-Verhalten zusammen

|          Mode          |  r   |  r+  |  w   |  w+  |  a   |  a+  |
| :--------------------: | :--: | :--: | :--: | :--: | :--: | :--: |
|          Read          |  +   |  +   |      |  +   |      |  +   |
|         Write          |      |  +   |  +   |  +   |  +   |  +   |
|         Create         |      |      |  +   |  +   |  +   |  +   |
|         Cover          |      |      |  +   |  +   |      |      |
| Point in the beginning |  +   |  +   |  +   |  +   |      |      |
|    Point in the end    |      |      |      |      |  +   |  +   |

und der Entscheidungszweig

Geben Sie hier die Bildbeschreibung ein

Infinitesimalrechnung
quelle
Mit welcher Software haben Sie das Baumdiagramm erstellt?
Fluss
Mich würde auch interessieren - Dia?
Nerdoc
22

Ich habe so etwas ausprobiert und es funktioniert wie erwartet:

f = open("c:\\log.log", 'r+b')
f.write("\x5F\x9D\x3E")
f.read(100)
f.close()

Wo:

f.read (Größe) - Um den Inhalt einer Datei zu lesen, rufen Sie f.read (Größe) auf, das eine bestimmte Datenmenge liest und als Zeichenfolge zurückgibt.

Und:

f.write (string) schreibt den Inhalt des Strings in die Datei und gibt None zurück.

Wenn Sie das Python-Tutorial zum Lesen und Schreiben von Dateien öffnen , werden Sie Folgendes feststellen:

'r +' öffnet die Datei zum Lesen und Schreiben.

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'.

Artsiom Rudzenka
quelle
5
Auch das Lesen und Schreiben funktioniert im Modus 'r + b' gleich gut, aber Sie müssen f.seek (0) zwischen f.read () und f.write () verwenden, um den Cursor wieder an den Anfang der Datei zu setzen.
gaborous
2
Beachten Sie, dass die Daten, die Sie schreiben, nicht länger als die bereits vorhandenen Daten abgeschnitten werden. Verwenden Sie die truncateMethode, um dies zu stoppen.
Flimm