Dateien lesen und schreiben#
Klein 2021: Python 3
Kap. 12: Dateien lesen und schreiben
Schreiben und Einlesen einer Text-Datei#
So geht es: https://www.freecodecamp.org/news/with-open-in-python-with-statement-syntax-example/ . Wir lernen:
Die Funktionen
open()
undclose()
verwenden wir nicht;besser verwenden wir
with()
.
Wir schauen uns das nochmal genauer an.
Die folgende Zelle erzeugt uns eine Text-Datei:
drei Zeilen,
mit Umlauten,
die letzte Zeile ohne ein
\n
am Ende.
Dazu wird ein Objekt my_file
erzeugt, das über seine Methode write()
die Datei neu anlegt und (hier zeilenweise) nacheinander befüllt.
with open("hello.txt", "w") as my_file:
my_file.write("Hallo Welt!\n")
my_file.write("Wie bist Du doch")
my_file.write(" schön und hässlich zugleich.\n")
my_file.write("Schöne Grüße!")
Diese Datei liegt dann im selben Verzeichnis wie das vorliegende Notebook. Aufgabe:
minimal: mit einem Text-Editor anschauen
explorativ: gerne auch verändern, unter anderem Namen wieder speichern, ggf. untigen Dateinamen dann anpassen
So lesen wir diese Datei zeilenweise wieder ein:
zeilen_mit_newline = []
with open("hello.txt") as my_file:
for line in my_file:
zeilen_mit_newline.append(line)
zeilen_mit_newline
['Hallo Welt!\n',
'Wie bist Du doch schön und hässlich zugleich.\n',
'Schöne Grüße!']
Wir stellen fest, dass beim zeilenweisen Einlesen die \n
erhalten bleiben.
Im Normalfall lesen eine Datei aber lieber komplett ein:
with open("hello.txt") as my_file:
text = my_file.read()
text
'Hallo Welt!\nWie bist Du doch schön und hässlich zugleich.\nSchöne Grüße!'
Die einzelnen Zeilen – aber ohne die \n
– erhalten wir dann über ein split()
über die Newlines:
# nicht so gut:zeilen = text.split("'\n'")
# besser:
zeilen = text.splitlines()
zeilen
['Hallo Welt!',
'Wie bist Du doch schön und hässlich zugleich.',
'Schöne Grüße!']
Print mit f-String#
Wir verwenden entweder ganz einfache, unformatierte Print-Statements, oder besser formatted string literals, kurz f-strings. So geht das:
spezifisch Formatierung: z.B. https://builtin.com/data-science/python-f-string
Ein f-String ist ein String, in dem man Ausdrücke „formatiert einsetzen“ und so zu einem Teil eines Strings machen kann. Das ist insbesondere interessant, wenn man (int- float-) Zahlen auf die Konsole oder in eine Text-Datei ausgeben will.
Wir wollen den Inhalt des folgenden Dict kontrolliert in die Konsole drucken:
Naturkonstanten = { "Lichtgeschwindigkeit": 299792458,
"Normfallbeschleunigung": 9.80665,
"Begrüßung": "Grüß Gott!" }
for key, value in Naturkonstanten.items():
print( f"Der Schlüssel ist: {key}; und der Value ist: {value}")
Der Schlüssel ist: Lichtgeschwindigkeit; und der Value ist: 299792458
Der Schlüssel ist: Normfallbeschleunigung; und der Value ist: 9.80665
Der Schlüssel ist: Begrüßung; und der Value ist: Grüß Gott!
Nun wollen wir das in eine Datei speichern. Effizient ist es, eine Liste von Text-Snippets zu erzeugen, die man anschließend sehr schnell in einen zusammenhängenden String verwandeln kann. Auch das machen wir mit f-Strings.
text_liste = []
for key, value in Naturkonstanten.items():
text_liste.append( f"{key}: {value}")
text_liste
['Lichtgeschwindigkeit: 299792458',
'Normfallbeschleunigung: 9.80665',
'Begrüßung: Grüß Gott!']
Wir sehen hier, dass auch die Zahlen jetzt als Strings vorliegen.
In einen zusammenhängenden Text überführen mit join()
:
text = "\n".join(text_liste)
text
'Lichtgeschwindigkeit: 299792458\nNormfallbeschleunigung: 9.80665\nBegrüßung: Grüß Gott!'
(Für Aufmerksame: Wir haben hier nicht nur eine Text-, sondern sogar eine CSV-Datei erstellt – bei der das Trennzeichen allerdings kein Komma, sondern ein “:” ist.)
Diese Text-Datei kann man nun wie oben mit with open(..., "w") as ...
als Text-Datei auf Festplatte speichern.
with open("Naturkonstanten.csv", "w") as my_Naturkonstanten:
my_Naturkonstanten.write(text)
JSON#
(Vorschau, nicht mehr in Python-101)
Quelle: https://www.programiz.com/python-programming/json
Wir lesen im folgenden eine JSON aus einer Datei ein, verändern einen einzelnen Wert, und schreiben das Resultat als neue JSON-Datei heraus.
import json
path_to_file = "json-beispiel42.ipynb" # ipynb werden im json-Format gespeichert
with open(path_to_file, 'r') as f:
data = json.load(f)
data['cells']
[{'cell_type': 'markdown',
'id': '64fbc19b',
'metadata': {},
'source': ['# json-beispiel42\n',
'\n',
'Beispiel zu JSON. Die Datei {doc}`json-beispiel42` wird durch das Notebook {doc}`e_Dateien-lesen-schreiben` gelesen, geändert und unter dem neuem Dateinamen {doc}`json-beispiel42_AUTO` wieder geschrieben.']},
{'cell_type': 'code',
'execution_count': 3,
'id': '962e258a',
'metadata': {},
'outputs': [],
'source': ['if True:\n', ' Antwort = 42']},
{'cell_type': 'code',
'execution_count': 4,
'id': '39b70b20',
'metadata': {},
'outputs': [{'name': 'stdout',
'output_type': 'stream',
'text': ['Antwort: 42\n']}],
'source': ['print("Antwort:", Antwort)']}]
data['cells'][1]['source'] = ['sechs = 6\n', 'sieben = 7\n', 'if True:\n', ' Antwort = ...\n']
with open('json-beispiel42_AUTO.ipynb', 'w') as json_file:
json.dump(data, json_file)