Das NumTrip Spiel startet derzeit jedesmal wenn wir es starten von neuem. Das heisst, der Spielstand des letzten Spiels wurde nicht gespeichert. Die spielende Person muss also entweder jedes Spiel in einem Zug durchspielen, oder verliert Ihren Fortschritt.
Moderne Programme und Spiele haben meistens die Möglichkeit, Daten und Informationen permanent zu speichern. Das bedeutet, die Daten sind auch nach dem stoppen und Neustarten des Programms noch vorhanden.
Wie funktioniert speichern?
Wenn wir in Python eine Variable generieren wird diese im Arbeitsspeicher (RAM) des Rechners gespeichert. Wie Ihr bestimmt wisst, ist der Arbeitsspeicher flüchtig. Das heisst, wenn der Computer ausgeschalten wird oder das Programm beendet wird gehen die Informationen verloren. Der einzige Speicher, der auch nach einem Neustart noch vorhanden ist, ist die Festplatte (z.B. SSD). Wir brauchen also eine Möglichkeit, die wichtigsten Informationen auf die Festplatte zu speichern.
Typischerweise funktioniert dies durch Dateien auf dem Computer. Ihr kennt das schon von anderen Programmen. Wenn Ihr z.B. im Word eine Textdatei bearbeitet, werdet Ihr beim speichern gefragt wo die Datei gespeichert werden sollte und wie sie heissen soll.
Nachdem dieser Dialog ausgeführt wird ist die Datei permanent auf der Festplatte gespeichert und kann auch wieder aufgerufen werden.
In Python
Programmiersprachen verwenden oft sogenannte standardisierte Dateiformate um Daten zu Speichern. Diese sind nichts anderes, als eine Abmachung darüber, in welchem Format die Datei gespeichert ist. Wenn Ihr an das Beispiel der Word Datei zurückdenkt fällt euch bestimmt auf, das diese Dateien z.B. die Endung .docx haben. Dies dient dem Zweck, dass andere Programme wissen, in welchem Format die Informationen in dieser Datei gespeichert sind, und wie sie beim öffnen interpretiert werden sollten.
Ein solches Dateiformat ist JSON. Dieses kommt ursprünglich von der Programmiersprache JavaScript, wurde mittlerweile aber in vielen anderen Sprachen aufgenommen, unter anderem von Python.
Wenn wir mit JSON arbeiten wollen, importieren wir das Modul dazu ganz einfach:
import json
Wir können aber nicht jegliche Variablen direkt in JSON speichern! Dazu benötigen wir eine Datensammlung:
daten = {}
In diese Datensammlung können wir nun unsere Variablen hineinschreiben. Im folgenden Beispiel wird der Inhalt der Variable spielfeld
in die Datensammlung daten
unter dem Namen spielfeld
geschrieben:
daten['spielfeld'] = spielfeld
Wir können beliebig viele Variablen in die selbe Datensammlung packen:
# selbe Datensammlung 'daten' wie oben
daten['hoehe'] = hoehe
Speichern
Wenn die Datensammlung alle Informationen enthält, die wir speichern wollen, können wir diese nun sehr einfach in eine Datei schreiben:
dateiname = 'numtrip.json'
daten = {}
with open(dateiname, 'w') as f:
json.dump(daten, f)
Der dateiname
ist das selbe, was wir bei Word beim speichern angeben - Der Name der Datei auf dem Computer. Die Option 'w'
steht für write (schreiben) und bedeutet, dass wir die Datei bearbeiten wollen. Das as datei
bedeutet, dass wir im Programm unter dem Namen f
(für file
) auf die geöffnete Datei zugreifen können.
Sie sehen, dass nach der Zeile, welche die Datei öffnet, ein Doppelpunkt und ein eingerückter Block folgt. Wir können in diesem eingerückten Block mit der Datei arbeiten. Sobald wir den eingerückten Block verlassen, wird die Datei gespeichert und wir haben keinen Zugriff mehr darauf, bis wir sie erneut öffnen.
Letztendlich gibt es nur noch die Zeile json.dump(daten, datei)
. Diese sagt dem JSON Modul, dass es die Datensammlung daten
in die geöffnete Datei f
speichern soll.
Laden
Wenn wir Informationen in eine Datei gespeichert haben, möchten wir diese natürlich auch wider ins Programm laden. Dies funktioniert ebenfalls sehr ähnlich:
with open(dateiname) as f:
daten = json.load(f)
spielfeld = daten['spielfeld']
Achtet darauf, dass wir hier auch die open
funktion von Python benutzen um die Datei zu öffnen, dieses mal fehlt aber die option w
. Da wir die Daten nur lesen und laden wollen, benötigen wir nicht die Schreibrechte. Die Datei ist jetzt also im schreibgeschützten Modus geöffnet. Mit der offenen datei können wir die Informationen ganz einfach mit Hilfe des JSON moduls wieder in eine Datensammlung laden (daten
).
Nun müssen wir nur noch die Informationen aus der Datensammlung in unsere Variablen kriegen. Auf die Einträge in einer Datensammlung wird mit der Notation meine_datensammlung['mein_eintrag']
zugegriffen.
Ausprobieren
Dateiname
EF-Informatik/exercises/io/1-daten-speichern.py
EF-Informatik/exercises/io/2-daten-laden.py
-
Verwenden Sie untenstehende Code-Snippets
daten_speichern.py
unddaten_laden.py
und führen Sie diese auf Ihrem Computer aus. Achten Sie darauf, dass beide im selben Ordner auf Ihrem Computer sind. -
Führen Sie das Snippet
daten_speichern.py
aus. Finden sie die entstandene Datei auf ihrem Computer und schauen Sie sich deren Inhalt in einem Text-Editor an (z.B. VSCode, Notepad, etc.). -
Führen Sie das Snippet
daten_laden.py
aus und schauen Sie sich den Output auf der Kommandozeile an. -
Bonus: Öffnen Sie die Datei erneut im Text Editor und verändern Sie die Teilnehmerliste: Verändern Sie einen Namen, löschen sie einen, oder fügen Sie einen hinzu. Führen Sie danach erneut das Snippet
daten_laden.py
aus. Was fällt Ihnen auf?
import json
def laden(dateiname):
with open(dateiname) as f:
datensammlung = json.load(f)
return datensammlung['teilnehmer:innen']
teilnehmer = laden('daten.json')
print(teilnehmer)
import json
def speichern(teilnehmer, dateiname):
datensammlung = {}
datensammlung['teilnehmer:innen'] = teilnehmer
with open(dateiname, 'w') as f:
json.dump(datensammlung, f)
teilnehmer = ['Anna', 'Bob', 'Theo', 'Karim', 'Robert']
speichern(teilnehmer, 'daten.json')
⭐ Daten speichern & laden