Else war für mich auch logisch aber else geht nicht da gab es einen Fehler.
Warum ist mir nicht klar.
Mir elif wird geprüft und wenn nicht vorhanden der Film hinzugefügt.
andie39‘s Fragen Thread
Wieso wird der elif nicht ausgeführt ich verstehe es grad echt nicht. Er macht doch erst die erste Abfrage ob die true ist und danach die elif.
Wenn der Film schon drin ist meldet er das sonst fügt er den hinzu.
Ich stimme zu eigentlich sollte er if… und else machen sind ja nur true oder false.
Aber funktionieren tut es ja meine ich. Bin nicht am PC gerade aber gestern hat es meine ich korrekt funktioniert.
Wenn der Film schon drin ist meldet er das sonst fügt er den hinzu.
Ich stimme zu eigentlich sollte er if… und else machen sind ja nur true oder false.
Aber funktionieren tut es ja meine ich. Bin nicht am PC gerade aber gestern hat es meine ich korrekt funktioniert.
Zu Deinem Code
Wie ich schon schrieb, ist `eingabe` ohne Zeile-Ende-Zeichen niemals in den Zeilen einer Datei. Daher ist die Abfrage `eingabe not in file` immer wahr.
Zweiter Grund ist, dass Du mit `file.read()` bereits die gesamte Datei gelesen hast, also `file` sofort mit StopIteration abbricht, und deshalb `not in` immer wahr ist.
Daher kann man das elif durch ein viel einfacheres `else` ersetzen, was auch logisch viel sinnvoller ist, denn sonst müßte man sich Gedanken machen, was diese Abfrage eigentlich soll.
Als nächstes ist `eingabe in file.read()` falsch, denn wenn Du schon den Film "Escape Room" eingetragen hast, kannst Du nicht mehr "Es" eintragen, weil das schon als Teilstring im ersten Film enthalten ist.
Code: Alles auswählen
def add_movie():
with open ("movies.csv", "r+") as file:
eingabe = input("Geben Sie einen Filmtitel ein:")
if eingabe in file.read():
print("Titel schon vorhanden")
elif eingabe not in file:
file.write(eingabe + "\n")
Zweiter Grund ist, dass Du mit `file.read()` bereits die gesamte Datei gelesen hast, also `file` sofort mit StopIteration abbricht, und deshalb `not in` immer wahr ist.
Daher kann man das elif durch ein viel einfacheres `else` ersetzen, was auch logisch viel sinnvoller ist, denn sonst müßte man sich Gedanken machen, was diese Abfrage eigentlich soll.
Als nächstes ist `eingabe in file.read()` falsch, denn wenn Du schon den Film "Escape Room" eingetragen hast, kannst Du nicht mehr "Es" eintragen, weil das schon als Teilstring im ersten Film enthalten ist.
Da bin ich jetzt komplett durcheinander. Ich weiß du meintest lesen und schreiben unabhängig.
Ich bin mir ehrlich nicht ganz klar, dass die eingabe nit in file immer wahr ist. Dann würde er ja immer die Eingabe eintragen.
Ich meine das war gestern beim Test nicht der Fall.
Wobei ich aber meine das du es sicher besser weißt als ich vielleicht habe ich nicht richtig hingesehen. Ich werde später wenn ich Zeit habe das noch einmal testen am PC
Ich bin mir ehrlich nicht ganz klar, dass die eingabe nit in file immer wahr ist. Dann würde er ja immer die Eingabe eintragen.
Ich meine das war gestern beim Test nicht der Fall.
Wobei ich aber meine das du es sicher besser weißt als ich vielleicht habe ich nicht richtig hingesehen. Ich werde später wenn ich Zeit habe das noch einmal testen am PC
Also ich habe es nochmal nachgeschaut und laufen lassen.
So wie ich es selber geschrieben habe:
Ist der Film unbekannt wird er eingetragen. Ist er bekannt kommt die Meldung das es den schon gibt und er wird nicht eingetragen.
Tausche ich elif durch else aus gibt es einen Syntaxfehler.
Ich weiß also wirklich nicht was falsch sein soll.
So wie ich es selber geschrieben habe:
Ist der Film unbekannt wird er eingetragen. Ist er bekannt kommt die Meldung das es den schon gibt und er wird nicht eingetragen.
Tausche ich elif durch else aus gibt es einen Syntaxfehler.
Ich weiß also wirklich nicht was falsch sein soll.
Das hier ist der Code zum hnizufügen;
Funktioniert.
Escape Room kann ich hinzufügen, Es danach natürlich nicht, das ist klar, weil Es dann ja schon in EScape Room vorkommt.
Code: Alles auswählen
def add_movie():
with open ("movies.csv", "r+") as file:
eingabe = input("Geben Sie einen Filmtitel ein:")
if eingabe in file.read():
print("Titel schon vorhanden")
elif eingabe not in file:
file.write(eingabe + "\n")
Escape Room kann ich hinzufügen, Es danach natürlich nicht, das ist klar, weil Es dann ja schon in EScape Room vorkommt.
Oh ja das der Syntaxfehler reiche ich nach.
Sorry
Ja stimmt das war mir sogar klar.
Ich hatte eigentlich gedacht ihr meint , dass ein Film trotzdem hinzugefügt wird auch wenn es den schon gibt.
Aber ja die in Suche in der gesamten Datei ist ein Problem.
Ich habe nachgedacht:
Ergo wäre es richtig, als .readlines zu lesen.
Dann kann ich alle Zeilen iterieren und mit einem Vergleichsoperator arbeiten.
Nur wenn einer der Elementa exakt gleich ist schreibt er den Film nicht rein.
Richtig?
Sorry
Ja stimmt das war mir sogar klar.
Ich hatte eigentlich gedacht ihr meint , dass ein Film trotzdem hinzugefügt wird auch wenn es den schon gibt.
Aber ja die in Suche in der gesamten Datei ist ein Problem.
Ich habe nachgedacht:
Ergo wäre es richtig, als .readlines zu lesen.
Dann kann ich alle Zeilen iterieren und mit einem Vergleichsoperator arbeiten.
Nur wenn einer der Elementa exakt gleich ist schreibt er den Film nicht rein.
Richtig?
So, ich habe nun seit über einer Stunde versucht die Funktion Film hinzufügen sauber zu schreiben, also nicht mit IN, was bei ähnlichen Filmen dann teilweise nicht klappen würde sondern auch mit einer
For-schleife welche die Objekte der Liste durchgeht siehe hier:
Ich war sicher, jetzt weiß ich es und schreibe das eben schnell den Rest zusammen aber nein.
Am Ende wurde es ein Trial and Error,
Entweder gibt es Fehlermeldungen oder die Funktion funktioniert nicht und fügt nichts hinzu.
Ich habe soviel probiert ich könnte alle Versuche gar nicht mehr posten.
Gerade frage ich mich, ob es noch Sinn macht das Programmieren weiter zu verfolgen, wenn ich schon an so einer einfachen Funktion scheitere.
For-schleife welche die Objekte der Liste durchgeht siehe hier:
Code: Alles auswählen
def add_movie():
with open ("movies.csv", "r") as file:
lines = file.readlines()
with open("movies.csv", "w") as file:
eingabe = input("Geben Sie einen Filmtitel ein:")
for element in lines:
Ich war sicher, jetzt weiß ich es und schreibe das eben schnell den Rest zusammen aber nein.
Am Ende wurde es ein Trial and Error,
Entweder gibt es Fehlermeldungen oder die Funktion funktioniert nicht und fügt nichts hinzu.
Ich habe soviel probiert ich könnte alle Versuche gar nicht mehr posten.
Gerade frage ich mich, ob es noch Sinn macht das Programmieren weiter zu verfolgen, wenn ich schon an so einer einfachen Funktion scheitere.
Ja es macht immer Sinn etwas neues zu lernen.
Bitte poste doch den ganzen Code mit zugehöriger, vollständiger Fehlermeldung. Der Code hört doch nicht mit einem Doppelpunkt auf.
Bitte poste doch den ganzen Code mit zugehöriger, vollständiger Fehlermeldung. Der Code hört doch nicht mit einem Doppelpunkt auf.
"When I got the music, I got a place to go" [Rancid, 1993]
Wie ich schon schrieb:
Ich habe soviel probiert ich könnte alle Versuche gar nicht mehr posten.
Naja es ist im Endeffekt wieder eine Schleifen-Geschichte. Ich war sicher jetzt weiß ich es aber Pustekuchen.
Ich sehe ehrlich gesagt keinen Fortschritt bei mir. Im Gegenteil es sind eher lauter Rückschritte.
- __blackjack__
- User
- Beiträge: 13077
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@andie39: Bei dem jetzt gezeigten fehlt ja etwas. Da muss auf jeden Fall die Liste geschrieben werden, weil Dateimodus "w" den Inhalt der Datei löscht.
Im Grunde versuchst Du da schon zu viel in einer Funktion zu lösen. Ich würde dringend raten das schreiben der Filme und das lesen der Filme in jeweils eine eigene Funktion auszulagern. Denn das sind eigenständige Operationen die in beide Richtungen etwas machen müssen, was sonst an anderen Stellen im Programm nichts zu suchen hat: Mit Zeilenendezeichen umgehen. Denn die gehören ja nicht zu den Filmtiteln. Die sind ausschliesslich für das speichern in einer Datei notwendig, damit man die Titel dort sinnvoll auseinanderhalten und wieder einlesen kann.
Darauf aufbauen kann man dann eine Funktion, die einen Filmtitel hinzufügt. Da würde ich Benutzerinteraktion komplett raus lassen. Genau wie beim schreiben und lesen der Daten. Kein `print()` und kein `input()`. Das gehört nicht zu den grundlegenden Operationen, die von diesen Funktionen durchgeführt werden. Lesen, Schreiben, und hinzufügen eines Titels sind ja beispielsweise unabhängig davon ob man über eine Textkonsole, eine GUI, oder eine Weboberfläche mit dem Benutzer kommuniziert, oder ob diese Operationen automatisiert von anderem Code verwendet werden, beispielsweise weil man eine Liste mit Filmtiteln von einer Webseite mit Neuerscheinungen, oder einem RSS-Feed bekommen hat, und die der Datei hinzufügen möchte.
Also als API beispielsweise:
Wobei `load_movies()` eine Liste mit den Filmtiteln liefert, also wirklich nur die Titel ohne Zeilenendezeichen. Und `add_movie()` einen Wahrheitswert liefert, je nach dem ob das hinzufügen erfolgreich war, oder ob es den Filmtitel schon gab.
Wenn man das implementiert, könnte eine interaktive Verwendung so aussehen:
Im Grunde versuchst Du da schon zu viel in einer Funktion zu lösen. Ich würde dringend raten das schreiben der Filme und das lesen der Filme in jeweils eine eigene Funktion auszulagern. Denn das sind eigenständige Operationen die in beide Richtungen etwas machen müssen, was sonst an anderen Stellen im Programm nichts zu suchen hat: Mit Zeilenendezeichen umgehen. Denn die gehören ja nicht zu den Filmtiteln. Die sind ausschliesslich für das speichern in einer Datei notwendig, damit man die Titel dort sinnvoll auseinanderhalten und wieder einlesen kann.
Darauf aufbauen kann man dann eine Funktion, die einen Filmtitel hinzufügt. Da würde ich Benutzerinteraktion komplett raus lassen. Genau wie beim schreiben und lesen der Daten. Kein `print()` und kein `input()`. Das gehört nicht zu den grundlegenden Operationen, die von diesen Funktionen durchgeführt werden. Lesen, Schreiben, und hinzufügen eines Titels sind ja beispielsweise unabhängig davon ob man über eine Textkonsole, eine GUI, oder eine Weboberfläche mit dem Benutzer kommuniziert, oder ob diese Operationen automatisiert von anderem Code verwendet werden, beispielsweise weil man eine Liste mit Filmtiteln von einer Webseite mit Neuerscheinungen, oder einem RSS-Feed bekommen hat, und die der Datei hinzufügen möchte.
Also als API beispielsweise:
Code: Alles auswählen
def load_movies(filename):
...
def save_movies(filename, movies):
...
def add_movie(filename, movie):
...
Wenn man das implementiert, könnte eine interaktive Verwendung so aussehen:
Code: Alles auswählen
In [143]: !cat movies.csv
Love actually
Die Hard
The Grinch
In [144]: load_movies("movies.csv")
Out[144]: ['Love actually', 'Die Hard', 'The Grinch']
In [145]: add_movie("movies.csv", "Spiderman - Homecoming") # Das sollte funktionieren.
Out[145]: True
In [146]: !cat movies.csv
Love actually
Die Hard
The Grinch
Spiderman - Homecoming
In [147]: add_movie("movies.csv", "Die Hard") # Den Film gibt es bereits.
Out[147]: False
In [148]: !cat movies.csv
Love actually
Die Hard
The Grinch
Spiderman - Homecoming
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Du warst ja schon nah dran
In der Schleife über alle Zeilen, prüft man jetzt jede Zeile ob sie der Eingabe entspricht. Wird ein Treffer gefunden, gibt es die entsprechende Meldung und die Schleife wird abgebrochen.
Der for - else Zweig wird nur ausgeführt, wenn es kein "break" in der Schleife ausgelöst wurde, also der Titel noch nicht vorhanden ist.
Dann - und nur dann öffnest du die Datei zum (a)nhängen.
In der Schleife über alle Zeilen, prüft man jetzt jede Zeile ob sie der Eingabe entspricht. Wird ein Treffer gefunden, gibt es die entsprechende Meldung und die Schleife wird abgebrochen.
Der for - else Zweig wird nur ausgeführt, wenn es kein "break" in der Schleife ausgelöst wurde, also der Titel noch nicht vorhanden ist.
Dann - und nur dann öffnest du die Datei zum (a)nhängen.
Code: Alles auswählen
def add_movie():
with open ("movies.csv", "r") as file:
lines = file.readlines()
eingabe = input("Geben Sie einen Filmtitel ein:")
for element in lines:
if eingabe == element:
print(f"Der Titel {eingabe} ist bereits in der Datenbank")
break
else:
print(f"Der Titel {eingabe} wird neu in die Datenbank eingefügt")
with open("movies.csv", "a") as file:
file.write(eingabe + "\n")
Mit break habe ich auch versucht solche Gedanken hatte ich konnte die aber nicht umsetzen.rogerb hat geschrieben: ↑Sonntag 16. Januar 2022, 00:37 Du warst ja schon nah dran
In der Schleife über alle Zeilen, prüft man jetzt jede Zeile ob sie der Eingabe entspricht. Wird ein Treffer gefunden, gibt es die entsprechende Meldung und die Schleife wird abgebrochen.
Der for - else Zweig wird nur ausgeführt, wenn es kein "break" in der Schleife ausgelöst wurde, also der Titel noch nicht vorhanden ist.
Dann - und nur dann öffnest du die Datei zum (a)nhängen.
Code: Alles auswählen
def add_movie(): with open ("movies.csv", "r") as file: lines = file.readlines() eingabe = input("Geben Sie einen Filmtitel ein:") for element in lines: if eingabe == element: print(f"Der Titel {eingabe} ist bereits in der Datenbank") break else: print(f"Der Titel {eingabe} wird neu in die Datenbank eingefügt") with open("movies.csv", "a") as file: file.write(eingabe + "\n")
Eben w. Write überschreibt ja eine Datei.
Das hier sieht schlüssig aus. Ich verstehe nicht warum ich auf den Weg nicht gekommen bin bzw warum ich andere Wege für schlüssig und logisch gehalten habe, es aber nicht sind.
Ich hatte soger eine Idee das erst in die Liste „lines“ die Eingabe als append Anhang hinzugefügt wird aber auch das hat nicht geklappt.