====================
== Andreas Streim ==
====================
I am a digital resident and this is my ~

Digital Nägel in die Wand schlagen

Programmieren Python Digitaltag

Ich habe schon ein paar mal erwähnt, dass ich der Meinung bin, jede/r sollte programmieren können. Zumindest so ein bisschen. So wie man vielleicht keinen Tisch schreinern kann, aber doch einen Nagel in die Wand hämmern, ohne einen Handwerker zu rufen. Und warum? Weil man damit einfach das eine oder andere Alltagsproblem lösen kann.

Nehmen wir mal an, da gibt es einen Digitaltag mit rund 1.400 Veranstaltungen. Und am Ende stellt man sich die Frage: Wie wie viele Stunden Programm waren das jetzt eigentlich? Klar, wenn man genug Zeit hat, dann kann man den Programmierer der Website und der dahinterliegenden Datenbank fragen, ob er das mal schnell raussuchen kann (und hoffen, dass er dann nicht sagt: Puh, das ist aber aufwändig…). Oder man kann jemanden dransetzen, um die Zeiten händisch zu addieren. Oder man schreibt ein kleines Programm. Doch wie fängt man das an?

Daten beschaffen und Muster erkennen

Ich schwöre für solche Zwecke ja auf Python - eine Programmiersprache, die gleichermaßen simpel wie auch mächtig ist. Erstmal brauchen wir die Anzeige aller Veranstaltungen auf der Website. Dazu gehen wir auf die Programm-Seite und wählen händisch “Alle Veranstaltungen” aus. Und dann werfen wir mal einen Blick auf den HTML-Code der Seite. Und stellen fest, dass die Zeiten in einem bestimmten Format abgelegt sind:

<span class="zeit">ganztägig </span>
<span class="zeit">14:00 - 15:00 Uhr</span>

Daten extrahieren

Also müssen wir jetzt nur noch die Website speichern (rechte Maustaste - “Speichern unter”) und dann alle Zeiten auslesen und addieren. Das könnte super elegant mit Hilfe einer sogenannten Regular Expression machen, so wie es ein echter Programmierer machen würde, oder einfach durch stumpfes Zerlegen des Strings, so wie ich das jetzt mal mache.

with open("website.html") as f:
    data=f.read()

dauer=[] # enthält die Dauer jeder einzelnen Veranstaltungen als String, so wie er auf der Website angezeigt wird
while data.find('<span class="zeit">')>-1: # die Dauer befindet sich in diesem HTML-Tag in der Form "ganztägig" oder z.B. "14:00 - 15:00 Uhr"
    data=data.split('<span class="zeit">',1)[1]
    zeit=data.split('</span>',1)[0]
    dauer.append(zeit.strip())
    data=data.split('</span>',1)[1]

print("Es wurden",len(dauer),"Veranstaltungen gefunden.")

Daten verarbeiten

Jetzt haben wir eine Liste mit dem Namen “dauer”, in der alle Zeiten in der Form “15:00 - 16:00 Uhr” bzw. “ganztägig” gespeichert sind.

Im letzten Schritt müssen wir nur noch ausrechnen, wie viele Minuten die jeweilige Veranstaltungsdauer ausmacht. Bei “15:00 - 16:00 Uhr” ist das relativ einfach, da sind es 60 Minuten. Bei “ganztägig” müssen wir eine Annahme treffen, wie lange die ganztägigen Veranstaltungen im Schnitt sind.

minuten=0 # enthält die Dauer aller Veranstaltungen in Minuten
anz_ganztaegig=0 # enthält die Anzahl der ganztägigen Veranstaltungen
for termin in dauer:
    if termin=="ganztägig": # es gibt ganztägige Termine 
        minuten=minuten+300 # ganztägige Termine werden mit einer durchschnittlichen Dauer von 5h angenommen
        anz_ganztaegig=anz_ganztaegig+1
    else: # ... alle anderen haben eine Dauer in der Form von z.B. "15:00 - 16:30 Uhr"
        anfang=termin.split(" ",1)[0] # das könnte man mit einem regulären Ausdruck sehr viel schöner machen als den String stumpf zu zerlegen. Aber es erfüllt seinen Zweck.
        ende=termin.split("- ",1)[1]
        ende=ende.split(" ",1)[0]
        FMT="%H:%M"
        tdelta=datetime.strptime(ende,FMT)-datetime.strptime(anfang,FMT)
        minuten=minuten+int(tdelta.seconds/60)

Und damit haben wir in der Variablen “minuten” die Dauer aller Digitaltags-Veranstaltungen aus dem Progranm. Die wir jetzt nur noch ausgeben müssen:

# Finales Ergebnis ausgeben
print("Insgesamt hat das Programm des Digitaltages 2020 damit",round(minuten/60),"Stunden gedauert.")

Das ist jetzt mit Sicherheit keine hohe Programmierkunst (ich habe es mal hier auf GitHub abgelegt) - mir ging es aber auch nur darum zu zeigen, wie man ein berufliches oder privates Alltagsproblem mit ein bisschen Programmcode schnell und einfach lösen kann.

Previous Post Next Post