Faragiri

Python lernen Programmiersprachen · Python-Grundlagen, Die Standardbibliothek

Elf Zeilen Standardbibliothek summieren eine Heizkostenabrechnung, sobald Semikolon, cp1252 und das Dezimalkomma geklärt sind. Danach beginnt das zweite Fach.

2Zweige
2Knoten darunter
3Tiefe

Schon installiert

Die vier Module, aus denen Nicoles Skript besteht

Das ist eine Oberfläche und sind nicht vier Bibliotheken: zusammen ausgeliefert, zusammen versioniert, und dafür geschrieben, einander weitergereicht zu werden.

Die Standardbibliothek
  • pathlibEin Pfad, der sich selbst öffnen, zusammensetzen und prüfen kann
  • csvDictReader, benannt nach der Kopfzeile, mit wählbarem Trennzeichen
  • collectionsdefaultdict, damit ein fehlender Schlüssel keine Abfrage braucht
  • statisticsmedian, mean, und der ehrliche float bei zwei Werten
  • jsonDieselben Zeilen auf dem Weg zu etwas anderem
  • sqlite3Eine echte Datenbank, im Interpreter, ohne Server
  • pathlibEin Pfad, der sich selbst öffnen, zusammensetzen und prüfen kann
  • csvDictReader, benannt nach der Kopfzeile, mit wählbarem Trennzeichen
  • collectionsdefaultdict, damit ein fehlender Schlüssel keine Abfrage braucht
  • statisticsmedian, mean, und der ehrliche float bei zwei Werten
  • jsonDieselben Zeilen auf dem Weg zu etwas anderem
  • sqlite3Eine echte Datenbank, im Interpreter, ohne Server

Sechs von rund zweihundert. Die Zeichnung sagt nicht, welche gut sind, sondern nur, dass jeder Griff nach draußen ein zweites Problem eröffnet.

Nicole Berg ist in Duisburg in einer Umschulung und hat im Praktikum bei einer Hausverwaltung die Heizkostenabrechnung bekommen: ein Export aus der Tabellenkalkulation, eine Zeile je Wohnung, Verbrauch in Kilowattstunden. Elf Zeilen Python sollten daraus eine Summe je Haus machen. Die elf Zeilen waren nach einer Stunde fertig und haben zwei Tage gebraucht.

Der Grund steht in keinem Kurs, weil er in englischen Daten nicht vorkommt. utf-8 auf einer cp1252-Datei wirft UnicodeDecodeError beim ersten Umlaut, und in einer deutschen Adressliste steht der schon in Zeile zwei. Dazu kommt das Trennzeichen: Ein CSV aus Excel trennt hierzulande mit Semikolon, also delimiter=";", weil das Komma bereits als Dezimaltrenner vergeben ist.

Und genau daran scheitert dann die Umrechnung. float("1.240,50") wirft ValueError, weil Python den Punkt als Dezimaltrenner liest. Der Punkt ist hier der Tausendertrenner und das Komma das Komma, also müssen beide getauscht werden, bevor gerechnet wird. Drei Zeilen, die jede deutsche Auswertung braucht und die in keinem Lehrbuch stehen.

Der eine Fehler, den Nicole dabei zwei Tage gekostet hat, ist der stille. Eine Wohnung stand mit 1.240 in der Datei, ohne Nachkommastellen, weil die Tabellenkalkulation den glatten Betrag so schreibt. float("1.240") ergibt 1.24 und wirft nichts, weil der Punkt für Python ein gültiger Dezimaltrenner ist. Die Zeile mit dem Komma bricht laut ab und wird sofort bemerkt, die Zeile ohne Komma rechnet weiter und macht aus 1.240 Kilowattstunden ein Tausendstel davon. Deshalb wird der Tausendertrenner zuerst entfernt und erst danach das Komma getauscht, und zwar auf jeder Zeile, nicht nur auf denen, die vorher abgebrochen sind.

Ist die Datei erst einmal offen, ist der Rest kurz. csv.DictReader liefert je Zeile ein Dictionary, benannt nach der Kopfzeile, sodass row["Verbrauch"] statt row[2] dasteht. defaultdict(list) hängt an einen Schlüssel an, den es noch nicht gibt, womit die Gruppierung je Haus ohne eine einzige Abfrage auskommt. Und statistics.median von zwei Werten ist ihr Mittel und damit ein float, was beim Vergleich zweier Wohnungen genau der Wert ist, der gebraucht wird.

Diese vier Namen kommen aus der Standardbibliothek und nicht aus dem Netz. Was dort noch liegt und warum das die eigentliche Stärke dieser Sprache ist, steht unter Die Standardbibliothek, und die Sprache selbst unter Python-Grundlagen.

Die zweite Woche ist keine Sprache

Die Grammatik dieser Sprache ist an einem Wochenende gelesen. Was danach kommt, ist ein anderes Fach, und niemand sagt vorher, dass es eines ist. Nicoles Skript lief auf ihrem Rechner und auf dem der Verwaltung nicht, und keine Zeile davon war falsch.

Dazwischen liegen vier Dinge, die alle halten müssen. python3 -m venv .venv gibt einem Projekt seinen eigenen Interpreter samt eigener Paketliste, statt dass sich alle Projekte eines Rechners um eine Liste streiten. Eine Sperrdatei hält die genauen Versionen fest und gehört ins Repository, sonst installiert der nächste Rechner, was am Tag des Klonens das Neueste war.

Ein Detail entscheidet dabei, ob ein Skript als Bibliothek taugt: if __name__ == "__main__" schützt Code, der beim Import nicht laufen darf. Ohne diese Zeile rechnet jeder Import die ganze Abrechnung durch. Die Umgebung und ihre Werkzeuge stehen unter Pakete und Umgebungen.

Die zweite Woche

Was halten muss, damit das Skript auf einem anderen Rechner läuft

Jedes Glied trägt die ganze Last, und das reißende ist nie das, über das jemand etwas gelernt hat.

Das offene Glied ist die Stelle, an der ein Anfängerprojekt tatsächlich scheitert, und das einzige, dessen Behebung vorher nichts kostet.

Was der Betrieb nicht erlaubt

Hier bleibt es bei dieser Leserschaft stehen, und es liegt nicht am Lernen. Auf dem Arbeitsplatzrechner in einer deutschen Verwaltung oder in einem mittelständischen Betrieb darf nichts installiert werden, der Zugang nach draußen läuft über einen Proxy, und ein Ticket bei der IT dauert länger als die Aufgabe. Jede Anleitung zu dieser Sprache fängt mit einem Installationsbefehl an, und der geht auf einem solchen Rechner ins Leere.

Daraus folgt die brauchbarste Regel für diese Sprache hierzulande: Die Standardbibliothek ist keine Notlösung, sondern die Lösung. Sechs ihrer Module decken die gesamte Abrechnung ab, und keines davon muss beantragt werden. Eine Umgebung mit venv braucht ebenfalls keine Rechte, weil sie im eigenen Ordner entsteht.

Wo tatsächlich etwas von außen gebraucht wird, nimmt man seit 2024 uv, das Umgebung, Installation und Sperrdatei in einem Werkzeug erledigt und die drei getrennten Befehle davor ersetzt. Für die Datei, die das Ganze auslöst, lohnt der Umweg über LibreOffice Calc: Dort lassen sich Zeichensatz und Trennzeichen beim Speichern einzeln wählen, und eine als UTF-8 mit Semikolon gespeicherte Datei erspart die drei Zeilen Reparatur von oben.

Offen bleibt, was mit dem Skript passiert, wenn es nicht mehr einmal im Monat von Hand, sondern jede Nacht laufen soll, und wer es dann startet. Das gehört zu Skripte und Automatisierung, und derselbe Code hinter einer Adresse im Browser zu Python im Web. Ob diese Sprache überhaupt die richtige erste ist, entscheidet nicht ihre Lesbarkeit, sondern was danach kommt: Die erste Sprache. Und warum ein Skript auf dem einen Rechner läuft und auf dem anderen nicht, beginnt bei der Codeausführung.

Darin, 2

Darüber