Menschen Statt Nummern

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 noch w für write und a für append).
  • forin …: 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 der print-Funktion am Bildschirm ausgegeben. (Weil in der Datei Zeilenenden '\n' enthalten sind, und print 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 Variable felderliste.
  • 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 Variable vorname abgespeichert.
  • Mit der Listenmethode append hängen wir den gerade gewonnenen Vornamen der Liste vornamensliste 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 und vorname, 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 Variablen anzahl_vornamen gespeichert.
  • Nun wird mit randint eine Zufallsposition ermittelt. Weil die Indizes der Liste bei 0 starten, hören sie auch schon bei anzahl_vornamen - 1 auf.
  • Aus der vornamensliste wird der Name der Zufallsposition ermittelt. Dieser Name wird in der Variable zufallsschü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ächster except-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 nachfolgenden excepts nichts mehr übrig lassen.