andie39‘s Fragen Thread

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
andie39
User
Beiträge: 136
Registriert: Dienstag 7. Dezember 2021, 16:32

Donnerstag 13. Januar 2022, 20:16

Sirius3 hat geschrieben:
Donnerstag 13. Januar 2022, 20:09
Das willst Du doch, alle Zeilen durchgehen, und prüfen, ob in irgendeiner Zeile Dein Filmtitel steht.
Und wenn die Datei bis zum Ende durchsucht worden ist, hört die Schleife automatisch auf.

Ja. Aber bei meinem Code endet die Suche ja nicht oder?
Sirius3
User
Beiträge: 15527
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 13. Januar 2022, 20:37

Woran siehst Du, dass die Suche nicht endet?
Benutzeravatar
andie39
User
Beiträge: 136
Registriert: Dienstag 7. Dezember 2021, 16:32

Donnerstag 13. Januar 2022, 20:42

Sirius3 hat geschrieben:
Donnerstag 13. Januar 2022, 20:37
Woran siehst Du, dass die Suche nicht endet?
Im Jupyter Notebook erschein ein * das für eine Endlosschleife steht.

Ich habe es jetzt einmal ähnlich deinem probiert:

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:       
            print("Titel schon vorhanden")
        else:  
            file.write(eingabe + "\n")
            
Hier wird ein Titel immer hinzugefügt, ist der Titel schon vorhanden passiert das immer noch.
Also if eingabe in file funktioniert so also nicht.
Benutzeravatar
__blackjack__
User
Beiträge: 9821
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 13. Januar 2022, 20:51

@andie39: Mit der Endlosschleife hat hier keiner so wirklich gerechnet weil wir kaum Erfahrungen mit "r+" als Dateimodus haben, weil das keiner macht. Das produziert hier natürlich tatsächlich eine Endlosschleife weil Du die Datei ja in jedem Schleifendurchlauf um eine Zeile erweiterst, die dann im nächsten Schleifendurchlauf gelesen wird, in dem dann die Datei wieder um eine Zeile erweitert wird, und dass dann "unendlich". Solange bis die Platte voll ist, was bei heutigen Plattengrössen eine Weile dauern könnte. 😀

Erst einmal das ganz grundsätzlich eine Schleife über die Zeilen endet wenn die Zeilen alle gelesen wurden, einmal tatsächlich als Schleife und dann was passiert wenn man den Iterator wiederholt nach dem nächsten Element fragt:

Code: Alles auswählen

In [22]: !cat movies.csv                                                        
Love actually
Die Hard
The Grinch

In [23]: file = open("movies.csv")                                              

In [24]: for movie_name in file: 
    ...:     print(movie_name) 
    ...:                                                                        
Love actually

Die Hard

The Grinch


In [25]: file.close()                                                           

In [26]: file = open("movies.csv")                                              

In [27]: next(file)                                                             
Out[27]: 'Love actually\n'

In [28]: next(file)                                                             
Out[28]: 'Die Hard\n'

In [29]: next(file)                                                             
Out[29]: 'The Grinch\n'

In [30]: next(file)                                                             
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-30-0f391ff92824> in <module>
----> 1 next(file)

StopIteration:
Und jetzt das der ``in``-Operator den Iterator komplett durchgeht:

Code: Alles auswählen

In [32]: file = open("movies.csv")                                              

In [33]: 'something' in file                                                    
Out[33]: False

In [34]: next(file)                                                             
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-34-0f391ff92824> in <module>
----> 1 next(file)

StopIteration: 

In [35]: file.close()                                                           
Nach dem ``in`` kann man keine Zeilen mehr von `file` bekommen, weil die für den Test schon alle ”verbraucht” wurden.

Zur Kodierung: Dann hast Du doch sogar schon ein praktisches Beispiel warum die Kodierungsangabe *wichtig* ist, und die weg zu lassen ein *Fehler*. Wenn Du UTF-8 explizit angibst, dann funktioniert das unter Windows *und* auf dem IPad. Ohne kannst Du die Daten zwischen den beiden Systemen nicht austauschen, sofern die Texte sich nicht auf ASCII beschränken. Und selbst das kann dann auf Systemen Probleme machen, bei denen eine Kodierung eingestellt ist, die ASCII nicht als Untermenge hat. Keine Ahnung wie weit so etwas beispielsweise im asiatischen oder arabischen Raum verbreitet ist.
I wish there was a button on my monitor to turn up the intelligence.
There's a button called 'brightness', but it doesn't work.
Benutzeravatar
andie39
User
Beiträge: 136
Registriert: Dienstag 7. Dezember 2021, 16:32

Donnerstag 13. Januar 2022, 21:05

Ja das mit der Codierung hattet ihr mir neulich ja dargelegt :)

Hier geht es mir aber gerade darum:
Wie kann ich denn nun die Datei durchsuchen ob die Eingabe schon vorhanden ist ohne das die Schleife ewig läuft oder das in alles verbraucht?
Bzw das verstehe ich nicht, ich prüfe ja erst ob die die Eingabe in der Datei ist. Aber selbst wenn das der Fall ist, gibt er nicht die Meldung aus. Er fügt immer wieder Filme hinzu auch wenn die schon vorhanden sind.
Benutzeravatar
__blackjack__
User
Beiträge: 9821
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Donnerstag 13. Januar 2022, 22:06

@andie39: Du prüfst nicht ob der Film schon in der Datei ist weil in der Datei Werte sind die mit einem Zeilenendezeichen enden, die Eingabe die Du da suchst aber nicht, also so wie das geschrieben ist, kann der Test niemals wahr sein. Noch mal die Beispieldatei aus meinem letzten Beitrag und der Benutzer hat "Die Hard" eingegeben, was ja ein Film in der Datei ist, aber der Wert "Die Hard" kommt so nicht als Element/Zeile in der Datei vor:

Code: Alles auswählen

In [38]: !cat movies.csv                                                        
Love actually
Die Hard
The Grinch

In [39]: file = open("movies.csv")                                              

In [40]: "Die Hard" in file                                                     
Out[40]: False
Wenn man sich anschaut was die Elemente in der Datei sind:

Code: Alles auswählen

In [41]: file = open("movies.csv")                                              

In [42]: next(file)                                                             
Out[42]: 'Love actually\n'

In [43]: next(file)                                                             
Out[43]: 'Die Hard\n'

In [44]: next(file)                                                             
Out[44]: 'The Grinch\n'

In [45]: next(file)                                                             
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-45-0f391ff92824> in <module>
----> 1 next(file)

StopIteration: 
Da ist tatsächlich kein "Die Hard" dabei sondern "Die Hard\n" was halt bei einem Vergleich ungleich ist. Dazu müsste man entweder an den gesuchten Wert das Zeilenendezeichen anhängen, oder bei den Zeilen das Zeilenendezeichen entfernen für den Test:

Code: Alles auswählen

In [46]: file = open("movies.csv")                                              

In [47]: "Die Hard\n" in file                                                   
Out[47]: True

In [48]: file = open("movies.csv")                                              

In [49]: "Die Hard" in (line.rstrip() for line in file)                         
Out[49]: True
Dein ursprünglicher Code hätte dann immer noch ein Problem mit der ``for``-Schleife, selbst wenn die nur lesend wäre: die konsumiert vor dem Test die erste Zeile der Datei, dass heisst den ersten Film könnte man auch dann nicht finden, wenn man das Zeilenendezeichen beim Test berücksichtigt.
I wish there was a button on my monitor to turn up the intelligence.
There's a button called 'brightness', but it doesn't work.
Sirius3
User
Beiträge: 15527
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 13. Januar 2022, 22:10

Das mit der Endlosschleife habe ich schon getestet. Beim Schreiben wird der Filepointer ja ans Ende des geschriebenen Textes gesetzt, so dass dann nichts mehr gelesen werden kann, es darf also eigentlich keine Endlossschleife geben. Aber vielleicht macht da Windows irgendwelches Woodoo.

@andie39: Du machst ja auch nicht das, was geschrieben habe. Das muß schon exakt so sein. Es kommt auf die Details an. 'r+' darf man wirklich nicht benutzen.
Benutzeravatar
andie39
User
Beiträge: 136
Registriert: Dienstag 7. Dezember 2021, 16:32

Freitag 14. Januar 2022, 20:23

Also ich eine Lesen und eine Schreibenfunktion.
Erst also dann die Funktion lesen und prüfen lassen und wenn die schief läuft die Schreibenfunktion?
Aber wie würde die lesen und prüfen Funktion aussehen damit diese funktioniert?
Benutzeravatar
andie39
User
Beiträge: 136
Registriert: Dienstag 7. Dezember 2021, 16:32

Freitag 14. Januar 2022, 21:12

Ich habe mal folgendes gefunden:

1. Verwenden Sie die Methode File readlines(), um eine Zeichenkette in einer Datei in Python zu finden
2. Verwenden der Methode file read() zum Suchen einer Zeichenkette in einer Datei in Python
3. Verwenden der Methode find zum Suchen einer Zeichenkette in einer Datei in Python
4. Verwenden des Moduls mmap zum Suchen einer Zeichenkette in einer Datei in Python

Vielleicht funktioniert das besser?
Und ich umgehe die Schleife etc

Also mit read eine Liste machen und die durchsuchen mit der for -Schleife das werde ich probieren
Benutzeravatar
andie39
User
Beiträge: 136
Registriert: Dienstag 7. Dezember 2021, 16:32

Freitag 14. Januar 2022, 21:55

Es funktioniert, ja ich weiss es ist noch immer r+
aber es funktioniert

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")
   
Benutzeravatar
Dennis89
User
Beiträge: 308
Registriert: Freitag 11. Dezember 2020, 15:13

Freitag 14. Januar 2022, 23:04

Hallo,

dann kannst du im nächsten Schritt das 'r+' rauswerfen und die Tipps einbauen die man dir genannt hat.
Falls du mal mit "richtig" mit CSV-Dateien arbeiten willst, es auch ein csv-Modul in Python:
https://docs.python.org/3/library/csv.html

Grüße
Dennis
“A ship is always safe at the shore, but that is not what it is built for.”
Benutzeravatar
andie39
User
Beiträge: 136
Registriert: Dienstag 7. Dezember 2021, 16:32

Freitag 14. Januar 2022, 23:14

Ja das werde ich machen.

Ich habe das bei der Entfernenfunktion auch schon gemacht.
Beide sollen aber noch angepasst werden, dass man mehr hinzufügen kann.

Aber erstmal funktionieren beide hier die entfernen Funktion:

Code: Alles auswählen

def remove_movie():
    with open("movies.csv", "r") as file:
        lines = file.readlines()
    with open("movies.csv", "w") as file:
        eingabe = input("Welchen Film möchten Sie enternen?")
        for element in lines:
            if element != eingabe + ("\n"):
                file.write(element)
               
Benutzeravatar
__blackjack__
User
Beiträge: 9821
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 15. Januar 2022, 01:10

@andie39: Das funktioniert so nicht. Du kannst nicht die ganze Datei einfach als *eine* Zeichenkette betrachten und darin dann darauf reagieren ob *irgendwo* die `eingabe` als Teilzeichenkette vorkommt. Weil man dann keinen Film mehr eintragen kann dessen Name ein *Teil* eines bereits vorhandenen Films ist.

Und der ``elif``-Teil macht keinen Sinn, weil dies Bedingung *immer* ``False`` ist. Man muss keine Bedingung prüfen von der man grundsätzlich das Ergebnis vorher kennt.

Wie ”real” soll das Szenario eigentlich sein, dass hier abgebildet wird? Denn es gibt ja durchaus unterschiedliche Filme, die den gleichen Titel haben.
I wish there was a button on my monitor to turn up the intelligence.
There's a button called 'brightness', but it doesn't work.
Benutzeravatar
andie39
User
Beiträge: 136
Registriert: Dienstag 7. Dezember 2021, 16:32

Samstag 15. Januar 2022, 08:29

@blackjack:

Wieso soll die immer false sein?
Er prüft ob der Titel vorkommt und wenn nicht, dann fügt er den Film hinzu.
Benutzeravatar
sparrow
User
Beiträge: 3043
Registriert: Freitag 17. April 2009, 10:28

Samstag 15. Januar 2022, 08:50

Welcher Fall soll denn eintreten, damit die Bedingung hinter dem elif erreicht wird und nach Auswertung nicht True sein könnte. Wenn man das Gegenteil einer Bedingung ohne weitere Bedingung hat, benutzt man else .

Wenn die Bedingung machen würde was sie soll. In deinem Fall ist die Bedingung nach dem elif aber immer False. Du prüft nicht, was du denkst. Probier es doch mal aus.
Antworten