Üben mit Lese-/Schreibmodi und Auswahl des richtigen Modus
Python bietet auch Modi, die sowohl das Lesen als auch das Schreiben innerhalb desselben open()
-Kontexts ermöglichen. Diese bieten mehr Flexibilität, erfordern aber eine sorgfältige Handhabung des Dateizeigers (file pointer).
- Lesen und Schreiben (
'r+'
): Öffnet eine bestehende Datei zum Lesen und Schreiben. Der Zeiger beginnt am Anfang. Das Schreiben überschreibt vorhandene Inhalte ab der Position des Zeigers.
- Schreiben und Lesen (
'w+'
): Öffnet eine Datei zum Schreiben und Lesen. Sie kürzt (truncate) die Datei, falls sie existiert, oder erstellt sie, falls nicht. Der Zeiger beginnt am Anfang.
- Anhängen und Lesen (
'a+'
): Öffnet eine Datei zum Anhängen (Schreiben am Ende) und Lesen. Sie erstellt die Datei, falls sie nicht existiert. Der Zeiger beginnt zum Schreiben am Ende, aber Sie können ihn verschieben (z. B. mit file.seek(0)
), um vom Anfang zu lesen.
Demonstrieren wir 'r+'
. Wir verwenden die Datei my_reading_file.txt
, die in Schritt 1 erstellt wurde. Wir öffnen sie, lesen den Inhalt, verschieben dann den Zeiger zurück zum Anfang und überschreiben den Anfang der Datei.
Erstellen Sie eine Python-Datei namens rplus_example.py
in /home/labex/project
. Fügen Sie diesen Code hinzu:
try:
## Open the file in read and write mode ('r+')
## The file must exist for this mode.
with open('/home/labex/project/my_reading_file.txt', 'r+') as file:
## Read the initial content
initial_content = file.read()
print("Initial file content:")
print(initial_content)
## Move the file pointer back to the beginning
print("\nMoving pointer to the beginning using file.seek(0).")
file.seek(0)
## Write new content at the beginning (overwriting existing content)
print("Writing new content...")
file.write("Prepended line 1.\n")
file.write("Prepended line 2.\n")
## If the new content is shorter than what was overwritten,
## the rest of the original content might remain unless truncated.
## We can use file.truncate() after writing to remove any trailing old data.
print("Truncating file to the current position to remove old trailing data.")
file.truncate()
print("\nContent written and file truncated.")
except FileNotFoundError:
print("Error: The file was not found. 'r+' requires the file to exist.")
except Exception as e:
print(f"An error occurred: {e}")
print("\nFinished with r+ mode example.")
Dieses Skript öffnet die Datei im Modus 'r+'
, liest, springt zurück zum Anfang (file.seek(0)
), schreibt neue Zeilen (überschreibt) und verwendet dann file.truncate()
, um alle verbleibenden Originalinhalte zu entfernen, die möglicherweise über den neu geschriebenen Text hinaus vorhanden sind.
Speichern Sie rplus_example.py
. Bevor Sie es ausführen, stellen wir sicher, dass my_reading_file.txt
ihren ursprünglichen Inhalt hat:
echo "This is the first line." > /home/labex/project/my_reading_file.txt
echo "This is the second line." >> /home/labex/project/my_reading_file.txt
Führen Sie nun das Python-Skript über das Terminal aus:
python rplus_example.py
Sie sehen den ursprünglichen Inhalt gedruckt, gefolgt von Meldungen über den Prozess:
Initial file content:
This is the first line.
This is the second line.
Moving pointer to the beginning using file.seek(0).
Writing new content...
Truncating file to the current position to remove old trailing data.
Content written and file truncated.
Finished with r+ mode example.
Überprüfen Sie den endgültigen Dateiinhalt mit cat
:
cat /home/labex/project/my_reading_file.txt
Die Ausgabe sollte dank des Überschreibens und Kürzens nur den neu geschriebenen Inhalt anzeigen:
Prepended line 1.
Prepended line 2.
Auswahl des geeigneten Dateizugriffsmodus (File Access Mode)
Die Auswahl des richtigen Modus ist entscheidend. Hier ist eine kurze Anleitung:
- Verwenden Sie
'r'
für schreibgeschützten (read-only) Zugriff auf bestehende Dateien.
- Verwenden Sie
'w'
, um eine neue Datei zu erstellen oder den Inhalt einer bestehenden Datei vollständig zu ersetzen.
- Verwenden Sie
'a'
, um am Ende einer Datei hinzuzufügen, ohne vorhandene Daten zu verlieren (gut für Protokolle/Logs).
- Verwenden Sie
'r+'
, um eine bestehende Datei zu lesen und zu ändern, und zwar vom Anfang an.
- Verwenden Sie
'w+'
, um eine Datei zu erstellen oder zu überschreiben und sie dann zu lesen/schreiben.
- Verwenden Sie
'a+'
, um an eine Datei anzuhängen und sie auch lesen zu können (erfordert seek()
).
Diese Tabelle fasst die wichtigsten Verhaltensweisen zusammen:
Modus |
Lesen (Read) |
Schreiben (Write) |
Erstellen, falls nicht vorhanden (Create if not exists) |
Kürzen, falls vorhanden (Truncate if exists) |
Zeigerposition (Initial) (Pointer Position) |
'r' |
Ja |
Nein |
Nein |
Nein |
Anfang (Beginning) |
'w' |
Nein |
Ja |
Ja |
Ja |
Anfang (Beginning) |
'a' |
Nein |
Ja |
Ja |
Nein |
Ende (End) |
'r+' |
Ja |
Ja |
Nein |
Nein |
Anfang (Beginning) |
'w+' |
Ja |
Ja |
Ja |
Ja |
Anfang (Beginning) |
'a+' |
Ja |
Ja |
Ja |
Nein |
Ende (End) |
Indem Sie berücksichtigen, ob Sie lesen, schreiben, anhängen, bestehende Dateien verarbeiten oder neue erstellen müssen, können Sie selbstbewusst den am besten geeigneten Modus für Ihre Aufgabe auswählen.