mitmario.dev

Der Bericht

Python Sandbox 4 Min Lesezeit 5 BeispieleLektion 6 von 8

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

Der Aufräumer mit argparse
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

Die Hilfe, die argparse schreibt
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

Ein Aufruf ohne Ordner
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

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

Eigene Fehler mit parser.error
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, kostenlos

Zu 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.