von: Konstantin
aktualisiert: March 12, 2025
Wenn du mit Python anfängst, wirst du schnell auf Fehlermeldungen stoßen. Das ist normal! Die gute Nachricht: Viele dieser Fehler lassen sich leicht vermeiden oder beheben. Hier schauen wir uns die häufigsten Fehler an und zeigen dir, wie du sie debuggen kannst.
Ein SyntaxError tritt auf, wenn Python auf einen Befehl stößt, den es nicht versteht. Das kann an Tippfehlern, fehlenden Zeichen oder einer falschen Struktur liegen. Python erwartet eine bestimmte Syntax – wenn diese verletzt wird, gibt es eine Fehlermeldung aus. Du solltest deinen Code nach folgenden möglichen Ursachen durchsuchen:
=
und ==
# Fehlende Klammer:
print("Hallo Welt"
# Fehlermeldung:
SyntaxError: unexpected EOF while parsing
Strukturen wie if
, for
, while
oder def
benötigen am Ende der Zeile einen Doppelpunkt.
# Fehlender Doppelpunkt:
if True
print("Ja")
# Fehlermeldung:
SyntaxError: expected ':'
# Korrektur:
if True:
print("Ja")
Python nutzt Einrückungen, um Codeblöcke zu definieren. Das betrifft Schleifen, Bedingungen, Funktionen und andere Strukturen. Fehlt die richtige Einrückung oder ist sie inkonsistent, gibt Python einen IndentationError aus.
# Falsche Einrückung:
if True:
print("Hallo Welt")
# Fehlermeldung:
IndentationError: expected an indented block
# Korrektur:
if True:
print("Hallo Welt")
Ebenso musst du bei der Definition von Funktionen auf die korrekte Einrückung achten:
# Falsche Einrückung:
def meine_funktion():
print("Hallo")
# Fehlermeldung:
IndentationError: expected an indented block
# Korrektur:
def meine_funktion():
print("Hallo")
Teilweise bekommst du Probleme, wenn du Einrückungen teils mit Tab, teils mit Leerzeichen einfügst. Das Problem kannst du sehr einfach lösen indem du dir entweder Tabs oder Leerzeichen für Einrückungen angewöhnst. Standard in Python sind 4 Leerzeichen pro Einrückung. Verwende außerdem immer die gleiche Einrückungstiefe für identische Code-Blöcke.
# Falsche Einrückung:
for i in range(5):
print(i)
print("Falsche Einrückung")
# Fehlermeldung:
IndentationError: unexpected indent
# Korrektur:
for i in range(5):
print(i)
print("Richtig eingerückt")
Oft bekommst du Probleme mit der korrekten Einrückung wenn du Code von Websiten oder anderen Editoren kopierst. Manche Editoren fügen unsichtbare Zeichen hinzu, die Python nicht mag. In diesem Fall solltest du alle Leerzeichen entfernen und die Einrückungen nochmal manuell korrigieren. Gerade um Einrückungsfehler zu vermeiden, solltest du den Code in einem guten Editor schreiben: VSCode, PyCharm und andere Editoren markieren Einrückungsfehler.
Hier sind einige Tipps:
Ein AttributeError
tritt auf, wenn du ein Attribut oder eine Methode eines Objekts aufrufst, die nicht existiert. Das kann passieren, wenn du dich vertippst, das falsche Objekt verwendest oder nicht bedenkst, dass ein Objekt bestimmte Methoden gar nicht hat.
Beispiel:
# Methode nicht verfügbar:
text = "Hallo Welt"
text.append("!")
# Fehlermeldung:
AttributeError: 'str' object has no attribute 'append'
Erklärung: Strings (str
) haben keine append()
-Methode. Diese gibt es nur bei Listen (list
).
Probiere es mit einer Liste:
text = ["Hallo Welt"]
text.append("!")
print(text)
Python-Objekte haben unterschiedliche Methoden und Attribute. Ein häufiger Fehler ist es, eine Methode aufzurufen, die für den jeweiligen Typ nicht existiert:
# Methode existiert nicht:
zahl = 42
zahl.upper()
# Fehlermeldung:
AttributeError: 'int' object has no attribute 'upper'
In diesem Fall macht die Methode upper()
auch wenig Sinn. Überlege was du eigentlich machen wolltest und verwende gegebenenfalls den korrekten Objekttyp.
Manchmal passiert es, dass eine Funktion None zurückgibt und du versuchst, darauf einen Methode aufzufrufen. Prüfe in diesem Fall, ob ein Objekt None
ist, bevor du darauf zugreifst:
# Funktion gibt None zurück:
def finde_nutzer():
return None
nutzer = finde_nutzer()
nutzer.name
# Fehlermeldung:
AttributeError: 'NoneType' object has no attribute 'name'
# Korrektur:
if nutzer is not None:
print(nutzer.name)
else:
print("Kein Nutzer gefunden.")
Weitere Ursachen für den AttributeError können sein:
text.uper()
statt text.upper()
.Wenn du einen AttributeError
bekommst, folge diesen Schritten:
print(type(objekt))
, um herauszufinden, womit du arbeitest.dir(objekt)
– Diese Funktion zeigt dir alle verfügbaren Attribute eines Objekts.None
ist – Falls ja, kläre, warum es None
ist.Ein NameError
ist einer der häufigsten Fehler in Python. Er tritt auf, wenn du versuchst, eine Variable oder Funktion zu verwenden, die Python nicht kennt. Definiere die Variable also vorher:
# Variable nicht definiert:
print(meine_variable)
# Fehlermeldung:
NameError: name 'meine_variable' is not defined
# Korrektur:
meine_variable = "Hallo Welt"
print(meine_variable)
Ein simpler Tippfehler kann zu einem NameError
führen:
# Tippfehler:
zahl = 100
print(zalh)
# Fehlermeldung:
NameError: name 'zalh' is not defined
# Korrektur:
zahl = 100
print(zahl)
Möglicherweise ist die Variable innerhalb eines Scopes nicht verfügbar. Wenn eine Variable z.B. nur innerhalb einer Funktion existiert, aber außerhalb verwendet wird, entsteht ein NameError
. In diesem Fall kannst du die Funktion so anpassen, dass sie die Variable zurückgibt:
# Lokale Variable:
def meine_funktion():
x = 5
print(x)
# Fehlermeldung:
NameError: name 'x' is not defined
# Korrektur:
def meine_funktion():
x = 5
return x
x = meine_funktion()
print(x)
Wenn du eine Funktion aus einem Modul verwenden möchtest, aber das Modul nicht vorher importiert hast, kommt es zu einem NameError
. Du musst das Modul vor der Verwendung importieren:
# math nicht importiert:
print(math.sqrt(25))
# Fehlermeldung:
NameError: name 'math' is not defined
# Korrektur:
import math
print(math.sqrt(25))
Wenn du auf einen NameError
stößt, folge diesen Schritten:
print(dir())
, um alle definierten Namen im aktuellen Scope anzuzeigen.Ein IndexError
tritt auf, wenn du versuchst, auf ein Element einer Liste, eines Tupels oder einer Zeichenkette zuzugreifen, das nicht existiert. Stelle also immer sicher, dass der Index im gültigen Bereich liegt:
# Index nicht vorhanden:
liste = [1, 2, 3]
print(liste[5])
# Fehlermeldung:
IndexError: list index out of range
# Mögliche Korrektur:
liste = [1, 2, 3]
if len(liste) > 5:
print(liste[5])
else:
print("Index nicht vorhanden!")
Python-Listen haben nullbasierte Indizes. Das bedeutet, dass der erste Wert bei 0
beginnt, nicht bei 1
. Daher überprüfe, ob du korrekt gezählt hast oder wähle z.B. das letzte Element.
# Knapp vorbei:
zahlen = [10, 20, 30]
print(zahlen[3])
# Fehlermeldung:
IndexError: list index out of range
# Mögliche Korrektur:
zahlen = [10, 20, 30]
print(zahlen[len(zahlen)-1])
Wenn eine Liste leer ist, kannst du auf keine Elemente zugreifen. Prüfe daher, ob die Liste nicht leer ist.
# Leere Liste:
leere_liste = []
print(leere_liste[0])
# Fehlermeldung:
IndexError: list index out of range
# Mögliche Korrektur:
leere_liste = []
if leere_liste:
print(leere_liste[0])
else:
print("Liste ist leer!")
Wenn du mit mehrdimensionalen Listen arbeitest, kann ein falscher Index leicht zu Fehlern führen. Prüfe daher alle Indizes oder arbeite mit len()
, um die maximale Länge der Listen abzufragen:
# Erster Index zu groß:
matrix = [[1, 2, 3], [4, 5, 6]]
print(matrix[2][1])
# Fehlermeldung:
IndexError: list index out of range
# Mögliche Korrektur:
matrix = [[1, 2, 3], [4, 5, 6]]
if len(matrix) > 2 and len(matrix[2]) > 1:
print(matrix[2][1])
else:
print("Index außerhalb des gültigen Bereichs")
Wenn du einen IndexError
bekommst, folge diesen Schritten:
len(liste)
, um die maximale Indexgrenze zu ermitteln.-1
das letzte Element ist.print()
– Gib Werte aus, bevor du darauf zugreifst.Ein FileNotFoundError
tritt auf, wenn du mit open()
oder ähnlichen Methoden eine Datei öffnen möchtest, die nicht gefunden wird. Vielleicht hast du die Datei noch nicht erstellt oder sie wurde versehentlich gelöscht. Stelle daher sicher, dass die Datei existiert:
# Beispiel:
with open("datei.txt", "r") as file:
content = file.read()
# Fehlermeldung:
FileNotFoundError: [Errno 2] No such file or directory: 'datei.txt'
# Mögliche Korrektur:
import os
if os.path.exists("datei.txt"):
with open("datei.txt", "r") as file:
content = file.read()
else:
print("Die Datei existiert nicht!")
Der FileNotFoundError
kann auftreten, wenn du den falschen Pfad zur Datei angibst. Stelle daher sicher, dass der Pfad korrekt ist:
# Falscher Dateipfad:
with open("C:/Benutzer/Test/datei.txt", "r") as file:
content = file.read()
# Fehlermeldung:
FileNotFoundError: [Errno 2] No such file or directory: 'C:/Benutzer/Test/datei.txt'
# Mögliche Korrektur:
import os
pfad = "C:/Benutzer/Test/datei.txt"
if os.path.exists(pfad):
with open(pfad, "r") as file:
content = file.read()
else:
print("Falscher Dateipfad!")
Wenn du den relativen Pfad zur Datei verwendest, musst du sicherstellen, dass dein Skript im richtigen Verzeichnis läuft. Überprüfe das Arbeitsverzeichnis und ändere es, falls nötig:
# Arbeitsverzeichnis überprüfen:
import os
print("Aktuelles Verzeichnis:", os.getcwd())
# Arbeitsverzeichnis wechseln:
os.chdir("C:/Benutzer/Test/")
Falls du nicht sicher bist, ob die Datei existiert, kannst du try-except
verwenden.
try:
with open("datei.txt", "r") as file:
content = file.read()
except FileNotFoundError:
print("Fehler: Datei nicht gefunden!")
Falls die Datei nicht existiert, kannst du sie auch automatisch erstellen:
try:
with open("datei.txt", "r") as file:
content = file.read()
except FileNotFoundError:
print("Datei nicht gefunden. Erstelle eine neue Datei.")
with open("datei.txt", "w") as file:
file.write("Dies ist eine neue Datei.")
Wenn du diesen Fehler bekommst, gehe folgendermaßen vor:
os.path.exists()
, um sicherzustellen, dass die Datei vorhanden ist.os.getcwd()
.try-except
, um den Fehler abzufangen und eine alternative Lösung zu implementieren.
Der PermissionError
(Errno 13
) bedeutet, dass Python auf eine Datei oder ein Verzeichnis zugreifen will, für das du keine Erlaubnis hast.
Beispiel:
# Code:
with open("/root/geheime_datei.txt", "w") as file:
file.write("Test")
# Fehlermeldung:
PermissionError: [Errno 13] Permission denied: '/root/geheime_datei.txt'
Manchmal benötigt eine Datei Administratorrechte, um darauf zugreifen zu können.
Lösung: Starte das Skript mit sudo
(Linux/macOS) oder als Administrator (Windows).
sudo python3 mein_script.py
Falls die Datei oder der Ordner schreibgeschützt ist, musst du vorher die Zugriffsrechte ändern.
Lösung: Prüfe und ändere die Berechtigungen und füge z.B. Schreibrechte hinzu:
chmod +w datei.txt
Oder nutze Python, um die Berechtigungen zu überprüfen:
import os
print(oct(os.stat("datei.txt").st_mode))
Wenn eine Datei von einem anderen Programm geöffnet ist, kann Python sie nicht überschreiben. Mir passiert das regelmäßig wenn ich mit Python Excel-Dateien lese oder schreibe. Oft habe ich die Datei dann noch geöffnet. Die Lösung ist naheliegend: Schließe das andere Programm oder nutze Python, um zu prüfen, ob die Datei geöffnet ist:
import psutil
for proc in psutil.process_iter():
try:
if "datei.txt" in proc.open_files():
print(f"Datei wird von {proc.name()} benutzt")
except Exception:
pass
Generell kannst du diesen Fehler mit einen try-except
Block abfangen. Achte darauf, dass du auch wirklich nur den PermissionError
abfängst, damit dir mögliche andere Probleme nicht entgehen:
try:
with open("geschützte_datei.txt", "w") as file:
file.write("Test")
except PermissionError:
print("Fehler: Keine Schreibrechte für diese Datei!")
ls -l
(Linux/macOS) oder dir
(Windows).try-except
, um Fehler abzufangen.
Ein ValueError
tritt in Python auf, wenn du eine Funktion mit einem ungültigen Wert aufrufst. Der übergebene Wert hat dann zwar den richtigen Datentyp, ist aber inhaltlich ungültig. Das passiert oft bei Umwandlungen oder Berechnungen.
Beispiel:
zahl = int("Hallo")
# Fehlermeldung:
ValueError: invalid literal for int() with base 10: 'Hallo'
Häufig tritt der ValueError auf, wenn du einen nicht-numerischen String in eine Zahl umwandeln willst.
# Nicht-numerischer String:
zahl = int("abc")
# Fehlermeldung:
ValueError: invalid literal for int() with base 10: 'abc'
# Mögliche Korrektur:
text = "123"
if text.isdigit():
zahl = int(text)
print(zahl)
else:
print("Kein gültiger Zahlenwert!")
Eventuell versuchst du falsche Parameter an Funktionen zu übergeben. Viele eingebaute Funktionen erwarten bestimmte Werte. Im folgenden Beispiel erwartet math.sqrt()
z.B. eine komplexe Zahl:
# Keine komplexe Zahl:
import math
math.sqrt(-1)
# Fehlermeldung:
ValueError: math domain error
# Nutze cmath für komplexe Zahlen:
import cmath
print(cmath.sqrt(-1))
Mir zumindest passieren immer wieder Listen- und Tupel-Entpackungsfehler. Wenn du mehr oder weniger Variablen als Werte erwartest, gibt es einen ValueError
. Manchmal passiert so etwas wenn eine Funktion ein Objekt wie eine Liste als Parameter erwartet, du aber versehentlich viele Einzelwerte übergibst. Letztlich musst du sicherstellen, dass die Anzahl der Variablen mit der Anzahl an übergebenen Werten übereinstimmt:
# Zu viele Werte:
a, b = [1, 2, 3]
# Fehlermeldung:
ValueError: too many values to unpack (expected 2)
# Mögliche Korrektur:
a, b, c = [1, 2, 3]
print(a, b, c)
Manche Funktionen akzeptieren nur bestimmte Wertebereiche.
# Beispiel:
zahlen = [1, 2, 3]
zahlen.remove(5)
# Fehlermeldung:
ValueError: list.remove(x): x not in list
# Mögliche Korrektur:
zahlen = [1, 2, 3]
if 5 in zahlen:
zahlen.remove(5)
Falls du einen ValueError
bekommst, folge diesen Schritten:
if
-Abfragen.try-except
, um Fehler abzufangen.Beispiel für eine sichere Eingabe:
try:
zahl = int(input("Gib eine Zahl ein: "))
except ValueError:
print("Bitte nur Zahlen eingeben!")
Ein TypeError
ist einer der häufigsten Fehler in Python. Er tritt auf, wenn du versuchst, mit inkompatiblen Datentypen zu arbeiten. Wenn du z.B. versuchst Strings und Zahlen zu addieren, dann musst du die Zahl es explizit in einen String umwandeln:
# Beispiel:
print("Das Ergebnis ist: " + 5)
# Fehlermeldung:
TypeError: can only concatenate str (not "int") to str
# Korrektur:
print("Das Ergebnis ist: " + str(5))
Wenn du eine Funktion nicht korrekt aufrufst und die beiden Klammern ()
vergisst, dann kann ein TypeError entstehen:
def meine_funktion():
return "Hallo"
# Funktion nicht aufgerufen:
text = meine_funktion
print(text + " Welt")
# Fehlermeldung:
TypeError: unsupported operand type(s) for +: 'function' and 'str'
# Korrektur:
text = meine_funktion()
print(text + " Welt")
Eventuell hast du versucht, einen Index auf eine Zahl oder ein anderes nicht-indexierbares Objekt anzuwenden. Bei mir deutet dieser Fehler meist auf irgendein Problem im Code davor hin. Da muss ich oft genauer hinsehen und überlegen wo etwas nicht so läuft wie ich es mir gedacht habe und das korrekte Objekt (z.B. Liste, Matrix, String, etc.) nicht erstellt wird. Im folgenden Beispiel musst du die Zahl einfach in einen String umwandeln und kannst dann auf die einzelnen Elemente zugreifen:
# Beispiel:
zahl = 1234
print(zahl[0])
# Fehlermeldung:
TypeError: 'int' object is not subscriptable
# Mögliche Korrektur:
zahl = "1234"
print(zahl[0])
Python-Funktionen erwarten oft bestimmte Typen. Wird ein falscher Typ übergeben, gibt es einen TypeError
.
# Beispiel:
import math
math.sqrt("16")
# Fehlermeldung:
TypeError: must be real number, not str
# Korrektur:
math.sqrt(int("16"))
Falls du einen TypeError
bekommst, folge diesen Schritten:
type(variable)
, um zu sehen, welchen Datentyp eine Variable hat.isinstance()
– Falls du in einer Funktion bestimmte Typen erwartest, prüfe sie vorherHier ein Beispiel für isinstance()
:
def addiere(a, b):
if isinstance(a, (int, float)) and isinstance(b, (int, float)):
return a + b
else:
raise TypeError("Beide Argumente müssen Zahlen sein!")
addiere(10, "2")
# Fehlermeldung:
TypeError: Beide Argumente müssen Zahlen sein!
Ein UnboundLocalError
tritt auf, wenn Python innerhalb einer Funktion auf eine Variable zugreifen möchte, die noch nicht zugewiesen wurde.
Beispiel:
def fehlerhafte_funktion():
print(x) # x nicht zugewiesen
x = 10
return x
fehlerhafte_funktion()
# Fehlermeldung:
UnboundLocalError: local variable 'x' referenced before assignment
Der häufigste Grund für diesen Fehler ist, dass eine Variable innerhalb einer Funktion verwendet wird, bevor ihr ein Wert zugewiesen wurde. In diesem Fall muss du die Zuweisung vor die Nutzung verschieben:
# Nutzung vor Zuweisung:
def beispiel():
print(name)
name = "Codedastic"
return name
beispiel()
# Fehlermeldung:
UnboundLocalError: local variable 'name' referenced before assignment
# Korrektur:
def beispiel():
name = "Codedastic"
print(name)
return name
beispiel()
Wenn eine globale Variable innerhalb einer Funktion geändert wird, betrachtet Python sie als lokal, wenn kein global
-Keyword verwendet wird. Du kannst das global Keyword verwenden, um klarzustellen, dass eine globale Variable gemeint ist:
# Beispiel ohne global:
zahl = 5
def inkrementieren():
zahl += 1 # Python denkt, dass 'zahl' lokal ist
print(zahl)
inkrementieren()
# Fehlermeldung:
UnboundLocalError: local variable 'zahl' referenced before assignment
# Mögliche Korrektur:
zahl = 5
def inkrementieren():
global zahl
zahl += 1
print(zahl)
inkrementieren()
Ein UnboundLocalError
kann auftreten, wenn eine innere Funktion versucht, eine Variable aus der äußeren Funktion zu ändern, ohne sie explizit als nonlocal
zu deklarieren. In diesem Fall hilft dir das nonlocal
-Keyword:
# Beispiel
def aeussere_funktion():
x = 10
def innere_funktion():
x += 1 # Python betrachtet x als lokale Variable
innere_funktion()
return x
aeussere_funktion()
# Fehlermeldung:
UnboundLocalError: local variable 'x' referenced before assignment
# Mögliche Korrektur:
def aeussere_funktion():
x = 10
def innere_funktion():
nonlocal x
x += 1
innere_funktion()
return x
print(aeussere_funktion())
Falls du auf diesen Fehler stößt, folge diesen Schritten:
global
.nonlocal
.print()
oder type()
, um herauszufinden, welche Variablen verfügbar sind.
Ein UnicodeError
tritt auf, wenn Python einen String nicht korrekt dekodieren oder kodieren kann. Oft passiert das bei der Verarbeitung von Dateien oder der Umwandlung zwischen verschiedenen Zeichensätzen.
Python verwendet standardmäßig UTF-8 für Strings, aber manche Dateien oder Systeme nutzen andere Kodierungen wie ASCII oder ISO-8859-1. In diesem Fall musst du die korrekte Kodierung wählen:
# Beispiel:
with open("textdatei.txt", "r") as file:
content = file.read()
# Fehlermeldung:
# UnicodeEncodeError: 'ascii' codec can't encode character '\xfc' in position 2: ordinal not in range(128)
# Korrektur:
with open("textdatei.txt", "r", encoding="utf-8") as file:
content = file.read()
Standard-ASCII kann nur Zeichen von 0-127
speichern. Sonderzeichen wie ä
, ö
, ü
oder é
führen zu Fehlern. Das kann schnell zu Problemen führen. Verwende in diesem Fall UTF-8 oder ignoriere nicht konvertierbare Zeichen:
# Beispiel:
text = "Hällo"
encoded_text = text.encode("ascii")
# Fehlermeldung:
# UnicodeEncodeError: 'ascii' codec can't encode character '\xe4' in position 1
# Lösung:
encoded_text = text.encode("utf-8")
encoded_text_ignore = text.encode("ascii", errors="ignore")
Möglicherweise hast du Probleme mit der Dekodierung eines Bytestrings. Nutze die richtige Kodierung. In der Regel ist dies UTF-8:
# Beispiel:
byte_text = b"GrÃGr\xc3¼Gr\xc3\xbcÃGr\xc3\xbc\xc3Gr\xc3\xbc\xc3\x9fe"
decoded_text = byte_text.decode("ascii")
# Fehlermeldung:
# UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2
# Lösung:
decoded_text = byte_text.decode("utf-8")
Verwende UTF-8, wenn du Dateien liest oder schreibst:
with open("textdatei.txt", "r", encoding="utf-8") as file:
content = file.read()
Prüfe die Kodierung deiner Datei, bevor du sie öffnest:
import chardet
with open("textdatei.txt", "rb") as file:
result = chardet.detect(file.read())
print(result["encoding"])
Nutze errors="ignore"
oder errors="replace"
, um fehlerhafte Zeichen zu umgehen:
text = b"GrÃGr\xc3¼Gr\xc3\xbcÃGr\xc3\xbc\xc3Gr\xc3\xbc\xc3\x9fe".decode("utf-8", errors="replace")
Ein MemoryError
tritt auf, wenn Python versucht, mehr Speicher zu verwenden, als verfügbar ist. Das kann passieren, wenn du riesige Datenmengen verarbeitest oder ineffizienten Code schreibst.
Manchmal arbeitest du mit zu großen Datenmengen. Wenn du versuchst, eine zu große Liste, ein riesiges Array oder eine sehr große Datei im Speicher zu halten, kann ein MemoryError
auftreten. Statt Listen zu verwenden, kannst du Generatoren nutzen:
# Beispiel mit Liste:
daten = [i for i in range(10**9)]
# Effizienter mit Generator:
daten = (i for i in range(10**9))
Python speichert Daten im Arbeitsspeicher. Wenn dein Programm viele ungenutzte Objekte hält, kann das zu einem MemoryError
führen. Du kannst in diesem Fall die ungenutzten Objekte mit dem Garbage Collector manuell löschen. Normalerweise läuft der Garbage Collector im Hintergrund und wird von Python verwaltet. Du solltest den Garbage Collector nur manuell nutzen wenn es wirklich nötig ist, da du sonst eventuell Bugs in den Code einführst oder die CPU unnötig beanspruchst. So verwendest du den Garbage Collector:
import gc
daten = [1] * (10**8)
del daten # Löscht die Liste
gc.collect() # Startet den Garbage Collector
Wenn du sehr große Dateien komplett in den Speicher lädst, kann dies zu Problemen führen. Du solltest die Datei schrittweise einlesen:
# Datei komplett geladen:
with open("riesige_datei.txt", "r") as file:
content = file.read()
# Schrittweises Laden:
with open("riesige_datei.txt", "r") as file:
for line in file:
print(line.strip())
Ineffiziente Nutzung von Listen kann ein weiteres Problem sein. Listen in Python können viel Speicher belegen, besonders wenn du sie wiederholt mit append()
vergrößerst. Nutze stattdessen array
für numerische Daten oder steige auf numpy
um:
# Jedes Mal neue Speicherzuweisung:
daten = []
for i in range(10**6):
daten.append(i)
# Mit array wird die Speichernutzung effizienter:
from array import array
daten = array("i", range(10**6))
Du kannst psutil nutzen, um den Speicherverbrauch zu messen und im Auge zu behalten. Oft is dies ein guter Ansatz, um zu erkennen wo der Fehler liegt und wo du genau zu viel Speicher verbrauchst:
import psutil
print(psutil.virtual_memory())
Falls du auf einen MemoryError
stößt, folge diesen Schritten:
psutil
, um den Speicherverbrauch zu messengc.collect()
auf, um den Speicher freizugeben.array.array
oder numpy
statt regulärer Listen.
Beide Fehler gehen in die gleiche Richtung. Ein ModuleNotFoundError
ist einer der häufigsten Fehler in Python. Er tritt auf, wenn du ein Modul importieren möchtest, das nicht gefunden oder nicht richtig installiert ist. Manchmal kann der Python Interpreter das Modul einfach nicht finden, da die Pfadangabe nicht korrekt ist. Der ImportError
ist ein eher genereller Fehler. Manchmal wird das Modul innerhalb des Paketes nicht gefunden oder du hast den Namen des Moduls falsch geschrieben.
Es gibt verschiedene Ursachen für die Fehler, aber die häufigsten sind:
Die häufigste und naheliegendste Ursache ist, dass das Modul nicht installiert ist. In diesem Fall muss du einfach das Modul installieren.
# Beispiel:
import numpy
# Fehlermeldung:
ModuleNotFoundError: No module named 'numpy'
Lösung: Installiere das Modul z.B. mit pip:
pip install numpy
Falls du mehrere Python-Versionen installiert hast, überprüfe, ob du das Modul für die richtige Version installierst:
python3 -m pip install numpy
Falls du in einer virtuellen Umgebung arbeitest, dann musst du z.B. pipenv verwenden:
pipenv install numpy
Falls du einen Packetmanager wie conda verwendest:
conda install anaconda::numpy
Eventuell ist das Modul nicht im richtigen Verzeichnis: Python sucht nach Modulen in bestimmten Verzeichnissen. Falls das Modul nicht im Suchpfad liegt, gibt es einen ImportError
. In diesem Fall kannst du mit sys.path
überprüfen, wo Python nach Modulen sucht und das Modul eventuell zum Pfad hinzufügen:
# Beispiel:
import mein_modul
# Fehlermeldung:
ModuleNotFoundError: No module named 'mein_modul'
# Überprüfe wo Python nach Modulen sucht:
import sys
print(sys.path)
# Füge den Pfad zum Modul hinzu:
import sys
sys.path.append("/pfad/zu/deinem/modul")
Ist der Modulname falsch geschrieben? Möglicherwiese hast du den Modulnamen falsch im Kopf oder du hast dich vertippt. Überprüfe den Modulnamen und vergewissere dich, dass der Modulname nicht falsch geschrieben ist.
Gibt es Konflikte mit vorhandenen Dateien? Falls du eine Datei mit demselben Namen wie ein Modul erstellt hast, kann das zu einem ImportError
führen.
Beispiel:
mein_script/
pandas.py # Datei mit demselben Namen wie das Modul
main.py
# Fehlermeldung:
ImportError: cannot import name 'pandas'
Lösung: Benenne deine Datei um, damit es keinen Namenskonflikt gibt.
Vielleicht ist das Modul nicht kompatibel mit der Python-Version? Falls du ein Modul installierst, das nicht mit deiner Python-Version kompatibel ist, kann das einen ImportError
verursachen.
Lösung: Überprüfe deine Python-Version:
python --version
Falls das Modul eine andere Version benötigt, installiere es mit der richtigen Python-Version:
python3.9 -m pip install modulname
Falls du auf einen ImportError
stößt, folge diesen Schritten:
pip list | grep modulname
sys.path
, um zu sehen, wo Python nach Modulen sucht.Module mit importlib
überprüfen – Falls du nicht sicher bist, ob das Modul verfügbar ist:
import importlib
print(importlib.util.find_spec("numpy"))
Ein KeyError
tritt in Python auf, wenn du versuchst, auf einen Schlüssel (Key
) in einem Dictionary zuzugreifen, der nicht existiert.
Der häufigste Grund für diesen Fehler ist, dass der gesuchte Schlüssel nicht existiert. In diesem Fall kannst du .get()
verwenden, um einen Standardwert zurückzugeben. Alternativ kannst du ein if
-statement verwenden:
# Beispiel:
daten = {"name": "Anna", "alter": 25}
print(daten["adresse"])
# Fehlermeldung:
KeyError: 'adresse'
# Korrektur mit get:
print(daten.get("adresse", "Adresse nicht vorhanden"))
# Korrektkur mit if:
if "adresse" in daten:
print(daten["adresse"])
else:
print("Schlüssel nicht gefunden")
Hast du den Schlüssel korrekt geschrieben? Python unterscheidet übrigens auch zwischen Groß- und Kleinschreibung. Stelle daher sicher, dass du den Schlüssel korrekt geschrieben hast:
# Falsche Schreibweise:
daten = {"Name": "Anna"}
print(daten["name"])
# Fehlermeldung:
KeyError: 'name'
# Korrekte Schreibweise:
print(daten["Name"])
Falls du auf einen KeyError
stößt, folge diesen Schritten:
if in
, um zu prüfen, ob der Schlüssel existiert.get()
, um einen Standardwert zurückzugebendefaultdict
, falls du immer einen Standardwert brauchst:from collections import defaultdict
daten = defaultdict(lambda: "Nicht vorhanden", {"name": "Anna"})
print(daten["stadt"]) # Gibt 'Nicht vorhanden' zurück
Ein StopIteration
tritt auf, wenn ein Iterator erschöpft ist, aber next()
trotzdem aufgerufen wird.
Beispiel:
zahlen = iter([1, 2, 3])
print(next(zahlen)) # 1
print(next(zahlen)) # 2
print(next(zahlen)) # 3
print(next(zahlen)) # Fehler!
# Fehlermeldung:
StopIteration
Ein häufiger Grund für diesen Fehler ist das wiederholte Aufrufen von next()
ohne zu überprüfen, ob der Iterator noch Elemente hat. In diesem Fall kannst du try-except verwenden, um den Fehler abzufangen:
# Beispiel:
zahlen = iter([1, 2, 3])
while True:
print(next(zahlen))
# Fehlermeldung:
StopIteration
# Mögliche Korrektur:
zahlen = iter([1, 2, 3])
while True:
try:
print(next(zahlen))
except StopIteration:
print("Keine weiteren Elemente.")
break
Generatoren in Python hören auf, wenn keine Werte mehr erzeugt werden. Verwende eine for
-Schleife, um den Generator korrekt zu durchlaufen:
# Ohne for-Schleife:
def mein_generator():
yield 1
yield 2
yield 3
g = mein_generator()
print(next(g))
print(next(g))
print(next(g))
print(next(g)) # Fehler!
# Fehlermeldung:
StopIteration
# Korrektur mit for-Schleife:
def mein_generator():
yield 1
yield 2
yield 3
for wert in mein_generator():
print(wert)
Wenn du eigene Iteratoren erstellst, musst du StopIteration
korrekt behandeln:
class MeinIterator:
def __init__(self, zahlen):
self.zahlen = zahlen
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index >= len(self.zahlen):
raise StopIteration("Iterator erschöpft")
wert = self.zahlen[self.index]
self.index += 1
return wert
it = MeinIterator([1, 2, 3])
for i in it:
print(i)
Falls du auf einen StopIteration
-Fehler stößt, folge diesen Schritten:
for
-Schleifen statt next()
, wenn möglich.try-except
, um den Fehler abzufangen.next()
aufrufst.
Python kann sehr große Zahlen speichern, aber in manchen Fällen stößt es an Grenzen. Ein OverflowError
passiert, wenn eine Berechnung ein Ergebnis liefert, das zu groß für den verwendeten Datentyp ist.
Beispiel:
import math
math.exp(1000) # Versucht, e^1000 zu berechnen
# Fehlermeldung:
OverflowError: math range error
Mathematische Funktionen wie math.exp()
oder pow()
können zu riesigen Zahlen führen. Begrenze in diesem Fall den Exponenten oder verwende decimal
für große Zahlen:
# Beispiel:
import math
math.exp(1000)
# Fehlermeldung:
OverflowError: math range error
# Mögliche Korrektur:
import decimal
print(decimal.Decimal(math.exp(500)))
Falls du auf einen OverflowError
stößt, folge diesen Schritten:
Nutze decimal
für große Zahlen, um die Präzision zu erhöhen.
Rekursion kann in Python eine elegante Möglichkeit sein, Probleme zu lösen. Doch wenn du nicht aufpasst, landest du schnell im RecursionError. Ein RecursionError
tritt auf, wenn eine Funktion sich zu oft selbst aufruft und dabei das sogenannte Rekursionslimitüberschreitet. Python schützt sich damit vor einem Stack Overflow, also einer Überlastung des Speicherbereichs für Funktionsaufrufe.
Beispiel:
# Verursacht Fehler:
def endlos():
return endlos()
endlos()
# Fehlermeldung:
RecursionError: maximum recursion depth exceeded
# Korrektur mit Abbruchbedingung:
def rekursion(n):
if n == 0:
return 1
return rekursion(n - 1)
rekursion(10)
Python hat eine eingebaute Begrenzung für die maximale Rekursionstiefe. Standardmäßig liegt das Limit bei etwa 1000 oder 3000 Rekursionen (abhängig von der Python-Version und dem Betriebssystem). Das Limit kannst du mit sys.getrecursionlimit()
herausfinden:
import sys
print(sys.getrecursionlimit())
Du kannst das Limit mit sys.setrecursionlimit(n)
erhöhen. Du solltest das Limit aber nur mit Bedacht erhöhen. Am besten lässt du ganz die Finger davon. Denn:
Besser ist es, eine iterative Lösung als Alternative zur Rekursion zu verwenden. Oder du schaust dir deinen Code nochmal genauer an und versuchst den Code zu überarbeiten. Vielleicht hast du etwas übersehen und kannst deine Implementierung verbessern!
Manchmal ist es sinnvoller, eine iterative Lösung statt einer rekursiven zu wählen. Diese Version verwendet eine while-Schleife, um das gleiche Ergebnis zu erreichen – ohne das Risiko eines RecursionError
:
def countdown_iterativ(n):
while n > 0:
print(n)
n -= 1
print("Fertig!")
countdown_iterativ(5)
Falls du rekursive Funktionen nicht vermeiden kannst, hilft der LRU-Cache, um doppelte Berechnungen zu vermeiden. Dazu importierst du lru_cache
aus functools
und verwendest lru_cache
als Decorator. Im folgenden Beispiel wäre die Berechnung ohne lru_cache
sehr langsam. Mit Cache speichert Python vorherige Werte und vermeidet unnötige Berechnungen:
from functools import lru_cache
@lru_cache(maxsize=None)
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(50))
Hier sind typische Fehler, die zu einem RecursionError
führen:
Ein KeyboardInterrupt
ist eine spezielle Ausnahme (Exception
), die in Python auftritt, wenn du ein laufendes Programm manuell unterbrichst. Das passiert meistens, wenn du Strg + C (Ctrl + C) auf deiner Tastatur drückst.
Wenn du Strg + C
drückst, passiert Folgendes:
SIGINT
(Interrupt Signal) an das Python-Programm.KeyboardInterrupt
-Exception.Das bedeutet: Python stoppt nicht sofort, sondern erst beim nächsten ausführbaren Codeblock. Wenn dein Skript gerade eine Aufgabe verarbeitet, kann es sein, dass es einen Moment dauert, bis die Unterbrechung erfolgt.
Hier ein Beispiel, das unendlich läuft – bis du Strg + C
drückst:
while True:
print("Das Programm läuft... (Drücke Strg + C zum Stoppen)")
Manchmal möchtest du das Programm nicht einfach „hart abbrechen“, sondern eine saubere Beendigung sicherstellen. Dazu kannst du try-except
verwenden:
try:
while True:
print("Läuft... Drücke Strg + C zum Beenden.")
except KeyboardInterrupt:
print("\nProgramm wurde durch den Benutzer gestoppt.")
Wenn du jetzt Strg + C
drückst, erhältst du keine Fehlermeldung, sondern eine kontrollierte Ausgabe:
Läuft... Drücke Strg + C zum Beenden.
Läuft... Drücke Strg + C zum Beenden.
^C
Programm wurde durch den Benutzer gestoppt.
Das ist nützlich, wenn du z. B. vor dem Beenden noch eine Datei speichern oder eine Datenbankverbindung schließen möchtest.
Falls du KeyboardInterrupt
manuell abfangen möchtest, kannst du das Programm mit sys.exit()
sauber beenden. Das hat folgende Vorteile:
Beispiel:
import sys
try:
while True:
print("Läuft...")
except KeyboardInterrupt:
print("\nBeenden...")
sys.exit()
Auf Unix-basierten Systemen (Linux, macOS) kannst du signal
verwenden, um SIGINT
oder andere Signale abzufangen. Hier wird anstelle von KeyboardInterrupt
direkt auf SIGINT
reagiert. Das kann nützlich sein, wenn du andere Signale wie SIGTERM
abfangen möchtest.
Beispiel:
import signal
import sys
def signal_handler(sig, frame):
print("\nSignal empfangen, Programm wird beendet...")
sys.exit()
signal.signal(signal.SIGINT, signal_handler)
while True:
print("Läuft...")
Ein RuntimeError
tritt auf, wenn während der Laufzeit eines Programms ein Problem auftritt, das Python nicht eindeutig einer bestimmten Fehlerkategorie (z. B. ValueError
, TypeError
) zuordnen kann. Er gehört zur Gruppe der "allgemeinen" Fehler und wird oft als Platzhalter für unerwartete Probleme verwendet.
Wichtig: Ein RuntimeError
tritt nicht auf, wenn dein Code schon beim Starten fehlschlägt. Er passiert erst während der Ausführung, also wenn das Programm bereits läuft.
Wenn eine Funktion sich selbst ruft, aber nie aufhört, kann ein RecursionError
auftreten, der eine Unterklasse von RuntimeError
ist. Sieh dir den Abschnitt zum RecursionError
dazu genauer an. Ein RuntimeError
kann auftreten, wenn du versuchst, Threads auf eine unsichere Weise zu manipulieren. Im folgenden Beispiel verursacht threading.current_thread().join()
einen RuntimeError
, weil sich ein Thread nicht selbst beenden kann:
# Beispiel:
import threading
def worker():
print("Thread läuft")
threading.current_thread().join() # Deadlock!
thread = threading.Thread(target=worker)
thread.start()
# Fehlermeldung:
RuntimeError: cannot join current thread
Stelle sicher, dass du einen Thread sicher stoppst, z. B. mit thread.join()
:
def worker():
print("Thread läuft")
thread = threading.Thread(target=worker)
thread.start()
thread.join() # Warten, bis der Thread beendet ist
Manchmal kann ein RuntimeError
auftreten, wenn du eine Schleife über eine veränderte Datenstruktur laufen lässt.
Beispiel:
my_list = [1, 2, 3]
for item in my_list:
my_list.append(item * 2) # Liste während Iteration verändert
# Fehlermeldung:
RuntimeError: dictionary changed size during iteration
Achte auf sich selbst blockierende Threads Verwende thread.join()
, um sicherzustellen, dass Threads beendet werden
Der ZeroDivisionError
tritt auf, wenn du versuchst, eine Zahl durch 0 zu teilen. Python stoppt dann dein Programm und gibt eine Fehlermeldung aus. Das passiert, weil eine Division durch null mathematisch nicht definiert ist.
Beispiel:
print(10 / 0)
# Fehlermeldung:
ZeroDivisionError: division by zero
Letztlich tritt der ZeroDivsionError immer auf, wenn du eine Zahl durch Null teilen willst. Das kann in folgenden Fällen vorkommen:
# Normale Division:
print(10 / 0) # Fehler
# Ganzahlige Division:
print(10 // 0) # Fehler
# Modulo-Operation:
print(10 % 0) # Fehler
# Berechnungen mit Variablen:
def divide(a, b):
return a / b
print(divide(10, 0)) # Fehler
Du kannst try-except
verwenden, um den Fehler abzufangen und dein Programm vor einem Absturz zu bewahren.
def divide(a, b):
try:
return a / b
except ZeroDivisionError:
return "Fehler: Division durch 0 nicht möglich"
print(divide(10, 0)) # Ausgabe: Fehler: Division durch 0 nicht möglich
print(divide(10, 2)) # Ausgabe: 5.0
Vor der Division prüfen:
def safe_divide(a, b):
if b == 0:
return "Fehler: Division durch 0"
return a / b
print(safe_divide(10, 0)) # Ausgabe: Fehler: Division durch 0
Du kannst einen Standardwert verwenden. Falls eine Division durch null passiert, kannst du eine Alternative zurückgeben:
def safe_divide(a, b):
return a / b if b != 0 else 0 # Rückgabe eines Standardwerts
print(safe_divide(10, 0)) # Ausgabe: 0
Wenn du eine Liste von Zahlen durch eine andere Zahl teilen willst, solltest du Nullwerte vorher filtern:
zahlen = [10, 5, 0, 2]
ergebnisse = [x / y if y != 0 else "Fehler" for x, y in zip(zahlen, [2, 0, 5, 0])]
print(ergebnisse) # Ausgabe: [5.0, 'Fehler', 0.0, 'Fehler']
Der ZeroDivisionError
tritt auf, wenn du durch null teilst. So kannst du den Fehler vermeiden:
try-except
, um den Fehler abzufangen.