Wir sind doch keine Nummern! #
Bertram;Berta;8A;2009;01.05.2009;
Cäsar Krieger;Cäcilia;8A;2009;15.03.2009;
Dörries;Dörte;8A;2009;01.04.2009;
Mustermann;Max;8A;2009;15.04.2009;
Santaclaus;Nikolaus;8A;2008;25.12.2008;
- Oft lassen sich Klassenlisten, die als Tabellen vorliegen, als csv-Dateien exportieren. csv-Dateien sind (wie .py-Dateien) einfache Textdateien mit der Endung csv.
- csv steht für comma separated values – typischerweise trennt das Semikolon (
;
) Tabellenfelder voneinander. (Es können aber auch Kommas, Leerzeichen, Tabulatoren oder etwas anderes sein.)
klassenlistendatei = open('8A-Muster.csv', 'r')
for zeile in klassenlistendatei:
print(zeile)
klassenlistendatei.close()
open
ist eine eingebaute Funktion in Python. Sie gibt uns ein so genannten Dateiobjekt zurück. Übergeben wird der Dateiname (eigentlich der Pfad – hier als relativer Pfad, wenn sich die gewünschte Datei im selben Verzeichnis befindet) und die Zeichenkette'r'
für den Lesemodus (r
wie read, daneben gibt es nochw
für write unda
für append).for
…in
…: ist eine so genannte Schleife. Die for-Schleife geht durch jede Zeile der Datei, innerhalb des eingerückten Blocks lässt sich mit der gewählten Variablen darauf zugreifen.- Hier wird jede Zeile (Variable
zeile
) mit derprint
-Funktion am Bildschirm ausgegeben. (Weil in der Datei Zeilenenden'\n'
enthalten sind, undprint
ebenfalls Zeilenenden nach der Ausgabe hinzufügt, entstehen bei der Ausgabe des Programms Leerzeilen zwischen den Zeilen der Datei.) - Wird das Dateiobjekt nicht mehr gebraucht, muss es geschlossen werden. Dazu wird am Dateiobjekt selbst die Methode
close
aufgerufen.
klassenlistendatei = open('8A-Muster.csv', 'r')
vornamensliste = []
for zeile in klassenlistendatei:
felderliste = zeile.split(';')
vorname = felderliste[1]
vornamensliste.append(vorname)
klassenlistendatei.close()
print(vornamensliste)
vornamensliste = []
erzeugt eine leere Liste. Listen sind sehr praktisch, sie können Zahlen, Zeichenketten und alle möglichen weiteren Objekte enthalten.zeile.split(';')
trennt die aktuelle Zeile aus der csv-Datei auf, und zwar an jedem Semikolon. Zurückgegeben wird… eine Liste! Und zwar ein Liste aller Zeichenketten, die in den Feldern der Zeile enthalten waren. Wir speichern diese Liste in der Variablefelderliste
.felderliste[1]
greift auf ein bestimmtes Element einer Liste zu, und zwar auf das zweite. Wie das? Programmierer_innen fangen bei 0 an zu zählen! An zweiter Stelle steht der Vorname, und der wird in der Variablevorname
abgespeichert.- Mit der Listenmethode
append
hängen wir den gerade gewonnenen Vornamen der Listevornamensliste
an. - Um die Liste anzusehen, geben wir sie mit der
print
-Funktion aus.
klassenlistendatei = open('8A-Muster.csv', 'r')
vornamensliste = []
for zeile in klassenlistendatei:
vornamensliste.append(zeile.split(';')[1]) # An Position 1 steht der Vorname.
klassenlistendatei.close()
print(vornamensliste)
- Die Kurzschreibweise verzichtet auf die beiden Variablen
felderliste
undvorname
, macht ansonsten aber genau das gleiche wie die längere Variante. Werden Sie diese Zeile in zwei Monaten noch verstehen? Oft ist es sinnvoll, die klarere Schreibweise zu wählen. - An unklaren Stellen könnte ansonsten auch ein Kommentar stehen. Kommentare werden vom Python-Interpreter ignoriert. (Sie laufen allerdings Gefahr, bei Code-Änderungen nicht mit aktualisiert zu werden, und verwirren dann umso mehr…)
from random import randint
klassenlistendatei = open('8A-Muster.csv', 'r')
vornamensliste = []
for zeile in klassenlistendatei:
felderliste = zeile.split(';')
vorname = felderliste[1]
vornamensliste.append(vorname)
klassenlistendatei.close()
anzahl_vornamen = len(vornamensliste)
zufallsposition = randint(0, anzahl_vornamen - 1)
zufallsschüler_in = vornamensliste[zufallsposition]
print('Zufällig gewählt wurde ' + zufallsschüler_in + '.')
- Die eingebaute Funktion
len
ermittelt die Länge der Liste. Die Länge wird in der Variablenanzahl_vornamen
gespeichert. - Nun wird mit
randint
eine Zufallsposition ermittelt. Weil die Indizes der Liste bei0
starten, hören sie auch schon beianzahl_vornamen - 1
auf. - Aus der
vornamensliste
wird der Name der Zufallsposition ermittelt. Dieser Name wird in der Variablezufallsschüler_in
abgespeichert. - Zeichenketten lassen sich mit dem Operator
+
miteinander verketten.
Optional:
from random import randint
try:
klassenlistendatei = open('8A-Muster.csv', 'r')
vornamensliste = []
for zeile in klassenlistendatei:
felderliste = zeile.split(';')
vorname = felderliste[1]
vornamensliste.append(vorname)
klassenlistendatei.close()
except FileNotFoundError:
print('Die Datei wurde nicht gefunden.')
vornamensliste = ['Franz', 'Franziska']
except:
print('Irgendetwas ist schief gelaufen...')
vornamensliste = ['Manni', 'Mannomann']
anzahl_vornamen = len(vornamensliste)
zufallsposition = randint(0, anzahl_vornamen - 1)
zufallsschüler_in = vornamensliste[zufallsposition]
print('Zufällig gewählt wurde ' + zufallsschüler_in + '.')
- Manchmal treten Fehler auf, dann bricht der Interpreter das Programm ab. Programmierer_innen sagen, es werde »eine Exception geworfen«.
- Solche Exceptions lassen sich abfangen. Dazu wird die kritische Operation (die vielleicht von etwas Externem abhängt: einer Datei, einer Netzwerkverbindung, usw.) in einen
try
-Block geschrieben. Ein nächsterexcept
-Block fängt Fehlermeldungen ab. - Die Fehlermeldungen lassen sich auch angeben, z.B. mit
except FileNotFoundError
. Wird nichts angegeben, werden alle Fehlermeldungen abgefangen. - Die Reihenfolge ist wichtig: ein
except
ohne Angabe würde nachfolgendenexcept
s nichts mehr übrig lassen.