Abschnitt 19 · Lektion 6
Der Bericht
Das Werkzeug kann alles, nur noch nicht von außen. Es liest immer kontoauszug.csv und zeigt immer
denselben Monat, und wer etwas anderes will, muss den Code ändern. Ein Werkzeug bekommt seine
Angaben aber beim Aufruf, so wie python main.py kontoauszug.csv --monat 2026-09.
Wie man Werte vom Aufruf liest, steht in Lektion 10.6, mit sys.argv. Dort steht auch, dass es für
Werkzeuge mit mehreren Werten und Schaltern das Modul argparse gibt. Jetzt ist es dran. Die
Beispiele nehmen den Aufräumer aus Lektion 11.7, der seinen Schalter --wirklich noch selbst aus
sys.argv gelesen hat.
Was argparse liest
import argparse
parser = argparse.ArgumentParser(description="Räumt einen Ordner auf, die Dateien nach ihrer Endung.")
parser.add_argument("ordner", help="der Ordner, der aufgeräumt wird")
parser.add_argument("--wirklich", action="store_true", help="erst damit wird verschoben")
args = parser.parse_args()
print(args)
if args.wirklich:
print(f"Jetzt wird {args.ordner} aufgeräumt.")
else:
print(f"Probelauf für {args.ordner}, es wird nichts verschoben.") Ein ArgumentParser bekommt eine Beschreibung des Programms, und jedes add_argument beschreibt
eine Angabe. Ein Name ohne Striche wie ordner ist ein Wert. Den muss man angeben, und zwar der
Reihe nach. Ein Name mit zwei Strichen wie --wirklich ist eine Option. Die kann man angeben,
an beliebiger Stelle.
action="store_true" macht daraus einen Schalter ohne eigenen Wert. Steht er da, ist er True,
sonst False.
parse_args() liest den Aufruf und gibt ein Objekt zurück, in dem jede Angabe als Attribut steht,
also args.ordner und args.wirklich. In der ersten Zeile der Ausgabe siehst du das ganze Objekt,
als Namespace mit beiden Werten. So heißt es. Aus --wirklich wird dabei wirklich, ohne
Striche.
Den vertippten Schalter --wirklch von damals lässt argparse gar nicht erst durch, das zeigt der
Befehl in der Befehlsleiste. Eine Abkürzung wie --wirk nimmt es dagegen an, solange sie nur zu
einer einzigen Option passt.
Die Hilfe schreibt sich selbst
import argparse
parser = argparse.ArgumentParser(description="Räumt einen Ordner auf, die Dateien nach ihrer Endung.")
parser.add_argument("ordner", help="der Ordner, der aufgeräumt wird")
parser.add_argument("--wirklich", action="store_true", help="erst damit wird verschoben")
args = parser.parse_args()
print(args)
if args.wirklich:
print(f"Jetzt wird {args.ordner} aufgeräumt.")
else:
print(f"Probelauf für {args.ordner}, es wird nichts verschoben.") Mit --help oder -h schreibt argparse eine Hilfe aus genau den Angaben, die im Programm stehen.
Oben die Aufrufzeile, darunter die Beschreibung und jede Angabe mit ihrem help-Text. Die
Überschriften sind englisch, positional arguments heißt Werte und options heißt Optionen. Danach
endet das Programm, ohne etwas anderes zu tun.
Wenn du ein halbes Jahr später nicht mehr weißt, wie dein eigenes Werkzeug aufgerufen wird, reicht
also ein --help.
Ein falscher Aufruf
import argparse
parser = argparse.ArgumentParser(description="Räumt einen Ordner auf, die Dateien nach ihrer Endung.")
parser.add_argument("ordner", help="der Ordner, der aufgeräumt wird")
parser.add_argument("--wirklich", action="store_true", help="erst damit wird verschoben")
args = parser.parse_args()
print(args)
if args.wirklich:
print(f"Jetzt wird {args.ordner} aufgeräumt.")
else:
print(f"Probelauf für {args.ordner}, es wird nichts verschoben.") Fehlt der Ordner, schreibt argparse die Aufrufzeile hin und darunter, was fehlt:
main.py: error: the following arguments are required: ordner. Beides steht auf dem Fehlerkanal,
und das Programm endet mit dem Exit-Code 2. Bei vielen Kommandozeilenprogrammen heißt der „falsch
aufgerufen“.
Geschrieben hat man dafür keine einzige Zeile. Es ist dieselbe Aufrufzeile wie bei sys.argv, nur
auf Englisch und von argparse selbst gebaut. Mit einem Wert zu viel oder einer Option, die es nicht
gibt, passiert dasselbe.
Eine Option, die nicht dasteht
import argparse
parser = argparse.ArgumentParser(description="Räumt einen Ordner auf, die Dateien nach ihrer Endung.")
parser.add_argument("ordner", help="der Ordner, der aufgeräumt wird")
parser.add_argument("--ziel", help="wohin die Unterordner kommen, sonst in den Ordner selbst")
args = parser.parse_args()
print(args)
for unterordner in ["Bilder", "Dokumente", "Archive"]:
print(f"{args.ziel}/{unterordner}") Eine Option mit Wert, wie --ziel, darf beim Aufruf fehlen. Dann steht in args.ziel aber nicht
etwa ein leerer Text, sondern None. Das Programm läuft trotzdem weiter und schreibt None/Bilder
hin, als wäre das ein Ordner. Kein Fehler. Beim echten Aufräumen gäbe es danach einen Ordner namens
None, den niemand haben wollte.
Dagegen gibt es zwei Wege. Wenn der Standardwert feststeht, bekommt add_argument ihn mit,
default="sortiert", und dann ist args.ziel nie None. Hängt er von etwas ab, das erst das
Programm weiß, wird selbst nachgefragt: if args.ziel is None: und dann der Wert, der dafür gelten
soll.
Beim Kontoauszug ist das so, denn der neueste Monat steht erst nach dem Einlesen fest. Ohne diese
Zeile hieße der Bericht bericht-None.csv.
Eigene Fehler in derselben Form
Foto vom Schreibtisch Lebenslauf, Stand 2019 import argparse
from pathlib import Path
parser = argparse.ArgumentParser(description="Räumt einen Ordner auf, die Dateien nach ihrer Endung.")
parser.add_argument("ordner", help="der Ordner, der aufgeräumt wird")
args = parser.parse_args()
if not Path(args.ordner).is_dir():
parser.error(f"den Ordner {args.ordner} gibt es nicht")
print("Gefunden:", sorted(datei.name for datei in Path(args.ordner).iterdir())) Manches kann argparse nicht wissen, zum Beispiel, ob es einen Ordner überhaupt gibt. Dafür hat der
Parser parser.error("…"). Damit erscheinen die Aufrufzeile und darunter der eigene Text nach
main.py: error:, und das Programm endet mit dem Exit-Code 2, genau wie bei einem fehlenden Wert.
Wer das Werkzeug benutzt, bekommt so jeden Fehler beim Aufruf in derselben Form, egal ob argparse ihn gefunden hat oder das Programm. Der eigene Text fängt deshalb klein an, wie die Meldungen von argparse.
Der Bericht für die Tabellenkalkulation
Neben der Übersicht schreibt das Werkzeug die Buchungen des Monats in eine CSV-Datei, wie in
Abschnitt 12. Also Semikolon als Trenner, utf-8-sig für Excel, newline="" für Windows, der
Betrag mit Komma über excel_zahl() und das Datum wieder als TT.MM.JJJJ, mit
strftime("%d.%m.%Y").
Der Monat steht im Dateinamen, bericht-2026-09.csv, damit der Oktober den September nicht
überschreibt. In der Tabelle steht auch die Kategorie jeder Buchung. Wenn du wissen willst, was
genau unter Lebensmittel gelandet ist, filterst du einfach die Spalte.
Was die Aufgabe will
main.py bekommt ihren Aufruf. Die Datei kommt als Wert, der Monat als Option, und ohne Option gilt
der neueste Monat der Datei. Danach folgen die Übersicht und der Bericht, und ein Monat ohne
Buchungen endet über parser.error.
Zum Mitnehmen
argparse liest den Aufruf eines Programms, Werte ohne Striche der Reihe nach und Optionen mit zwei Strichen in beliebiger Reihenfolge. Die Hilfe unter --help entsteht von selbst, und ein falscher Aufruf endet mit dem Exit-Code 2 und einer Zeile, in der steht, was fehlt. Fehlt eine Option mit Wert, ist sie None, ein Schalter mit store_true ist dann False, und mit parser.error() kommen eigene Fehler in derselben Form heraus.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 5 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.