Ich habe zur Einarbeitung eine kleine Funktion geschrieben. Sie liest eine Textdatei aus und überprüft, ob ein Wort vorhanden ist.
datei = open('Konfiguration.txt','r')
for zeile in datei:
Suchwort = zeile.partition("Window:")
if Suchwort[1] == "Window:":
print("Wort vorhanden")
break
Dauernd erhalte ich die Fehlermeldung "TabError: inconsistent use of tabs and spaces in indentation"
Wenn ich das "break" weglasse, funktioniert das Skript. Solche Probleme habe ich mit Javascript oder PHP nicht.
Hat Python Probleme mit Tabs und Leerzeichen ?
Du weißt aber schon, dass die _Einrückung_ bei Python fundamental ist? Es also _wichtig_ dass korrekt eingerückt ist, weil damit ein Block deklariert wird.
Es gibt einen Styleguide für Python ( PEP 8 ), den du dir anschauen solltest. Darin steht nicht nur, dass man Vairablennamen klein_mit_unterstrich schreibt, sondern auch, dass man immer mit 4 Leerzeichen einrückt. Das tust du nicht. Da Python nicht raten kann, was du nun womit meinst, steigt es mit der entsprechenden Fehlermeldung aus. Du benutzt in deinem Code nämlich beides. Leerzeichen und Tabs.
Es gibt einen Styleguide für Python ( PEP 8 ), den du dir anschauen solltest. Darin steht nicht nur, dass man Vairablennamen klein_mit_unterstrich schreibt, sondern auch, dass man immer mit 4 Leerzeichen einrückt. Das tust du nicht. Da Python nicht raten kann, was du nun womit meinst, steigt es mit der entsprechenden Fehlermeldung aus. Du benutzt in deinem Code nämlich beides. Leerzeichen und Tabs.
-
- User
- Beiträge: 2
- Registriert: Dienstag 29. September 2020, 13:34
Ich habe jetzt eine Lösung entdeckt:
Wenn man in MS Visual Studio Code die Zeilen markiert, wird im Hintergrund schwach ein Pfeil für ein Tab und ein Punkt für ein Leerzeichen angezeigt. Diese Zeichen müssen für jede Zeile penibel übereinstimmen. Bei mir entsprach ein Tab vier Leerzeichen. Als ich das Tab-Symbol durch die vier Leerzeichen ersetzte, funktionierte das Skript. Ich bin zwar erst in der Einarbeitungsphase, aber besonders zuverlässig erscheint mir Python nicht.
Wenn man in MS Visual Studio Code die Zeilen markiert, wird im Hintergrund schwach ein Pfeil für ein Tab und ein Punkt für ein Leerzeichen angezeigt. Diese Zeichen müssen für jede Zeile penibel übereinstimmen. Bei mir entsprach ein Tab vier Leerzeichen. Als ich das Tab-Symbol durch die vier Leerzeichen ersetzte, funktionierte das Skript. Ich bin zwar erst in der Einarbeitungsphase, aber besonders zuverlässig erscheint mir Python nicht.
Eine „Fail-Fast“-Herangehensweise ist nicht unzuverlässig, sondern verhindert zuverlässig, dass etwas passiert, womit man nicht rechnet. Ein Tab kann (je nach Einstellung des Texteditors) unterschiedlich dargestellt werden. Beispiel:
Wenn ein Tab vier Leerzeichen entspricht, sieht es so aus, als wenn `do_something_else()` außerhalb des `if`-Blocks steht, bei 8 sieht es so aus, als wenn es darin steht. Genau aus diesem Grund ist es in Python verboten, Tabs und Leerzeichen zu mischen.
Code: Alles auswählen
def foo():
....if condition:
........do_something()
[tab] do_something_else()
Na ja, die Einrückungen sind Teil der Syntax und die muss man halt einhalten. Es gibt zwei andere Sprachen die mit P anfangen und die nachgiebiger und dafür bekannt sind, zu raten, was der Programmierer gemeint haben könnte. Python ist da strenger. Was meinst du denn mit "nicht zuverlässig"?Hello World hat geschrieben: Dienstag 29. September 2020, 18:46 Ich bin zwar erst in der Einarbeitungsphase, aber besonders zuverlässig erscheint mir Python nicht.
- noisefloor
- User
- Beiträge: 4194
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
Das mit der Einrückung und das wie der Einrückung ist so ziemlich das fundamentalste, was es bei Python gibt. Das wird auch normalerweise ziemlich früh in jedem Tutorial erwähnt...
Gruß, noisefloor
So stellen Python-Programmierer auch normalerweise den Editor / die IDE ihrer Wahl ein: beim Druck auf Tab werden vier Leerzeichen eingefügt. Das entspricht dann auch der Vorgabe der PEP8.Bei mir entsprach ein Tab vier Leerzeichen
Das mit der Einrückung und das wie der Einrückung ist so ziemlich das fundamentalste, was es bei Python gibt. Das wird auch normalerweise ziemlich früh in jedem Tutorial erwähnt...
Gruß, noisefloor
Also hier nochmal der Code, wie er eingerück aussieht:
Die print-Zeile fängt mit 4 Leerzeichen an, sieht man natürlich nicht, weil das Tab dann auf 8 Stellen erweitert.
Jeder vernünftige Editor kann übrigens Tabs in Spaces und umgekehrt umwandeln. Das sollte man bei solchen Einrückfehlermeldungen als erstes machen.
Zum eigentlichen Code:
Dateien öffnet man innerhalb des with-Statements, damit sie auch wieder zuverlässig geschlossen werden. Text-Dateien sollte man immer mit einem (dem richtigen) Encoding öffnen.
Variablennamen werden immer komplett klein geschrieben. Wenn nur geprüft werden soll, ob ein Wort in der Zeile ist, ist `partition` etwas übertrieben:
Sollte es sich wirklich um eine Konfigurationsdatei handeln, dann ist die Endung verwirrend. Für Standard-Konfigurationsformate gibt es auch schon fertige Module.
Code: Alles auswählen
datei = open('Konfiguration.txt','r')
for zeile in datei:
Suchwort = zeile.partition("Window:")
if Suchwort[1] == "Window:":
print("Wort vorhanden")
break
Jeder vernünftige Editor kann übrigens Tabs in Spaces und umgekehrt umwandeln. Das sollte man bei solchen Einrückfehlermeldungen als erstes machen.
Zum eigentlichen Code:
Dateien öffnet man innerhalb des with-Statements, damit sie auch wieder zuverlässig geschlossen werden. Text-Dateien sollte man immer mit einem (dem richtigen) Encoding öffnen.
Variablennamen werden immer komplett klein geschrieben. Wenn nur geprüft werden soll, ob ein Wort in der Zeile ist, ist `partition` etwas übertrieben:
Code: Alles auswählen
with open("Konfiguration.txt", encoding="utf8") as lines:
for line in lines:
if "Windows:" in line:
print("Wort vorhanden")
break
- __blackjack__
- User
- Beiträge: 14052
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Das ganze mit `any()` und einem Generatorausdruck noch etwas kompakter ausgedrückt:
Ergänzend zum Kommentar von Sirius3 bezüglich Module für Standardformate: Sollte die Datei nicht in einem solchen Format vorliegen, das Format aber in Deiner Hand liegen, dann erfinde nix neues, sondern such Dir einen passenden Standard.
Code: Alles auswählen
with open("Konfiguration.txt", encoding="utf8") as lines:
if any("Windows:" in line for line in lines):
print("Wort vorhanden.")
“Vir, intelligence has nothing to do with politics!” — Londo Mollari