2016-05-13 3 views
2

(Ich benutze Python 2.7 für jetzt) ​​ Also vielleicht verstehe ich nicht, wie diese Codezeile funktioniert, weil für einen Teil meines Programms scheint es gut zu funktionieren, während es in einem anderen Teil nicht funktioniert.any() Funktion mit CSV-Datei in Python nicht verhält, wie ich es erwarte

elif not any(user in line for line in data): 

Grundsätzlich habe ich eine CSV-Datei, die ich aus bin zu lesen und in den Variablen „Daten“ wie folgt zu speichern:

f = open("scores.csv") 
data = csv.reader(f) 

die Variable „user“ ist eine Zeichenfolge aus einem Eintrag Feld in Tkinter, und die Variable "line" ist ein beliebiger Name für die for-Schleife, genau wie in einem Stück Code, der sagt "für i in Bereich (69):"

Also was mein Gehirn denkt, dass diese Linie sollte tun, dass, wenn es keine Übereinstimmung von Benutzer in einer der Zeilen in der CSV-Datei findet, es sollte den Code unter dieser Anweisung ausführen. Aber das scheint es nicht zu tun!

jedoch später in meinem Code versuche ich etwas ähnliches:

elif any(user in line for line in data): 

und dies scheint ohne Probleme zu arbeiten !! Ich habe keine Ahnung warum, und ich konnte nirgendwo im Internet jemanden finden, der versucht, das zu tun.

Ich versuche ein Login-Formular als Anfänger Projekt zu machen, da ich etwas Python weiß, also wollte ich sehen, was ich tun kann, aber ich scheine hier fest zu stecken.

ich meinen Code hochgeladen für jedermann GitHub Meinung https://github.com/Arunscape/login-form/blob/master/login.py

oh und keine Sorge über die „Passwörter“ in der CSV-Datei, sind sie natürlich fake!

Jede Hilfe wird geschätzt. Vielen Dank!!!

+2

Es wäre ideal, wenn Sie ein minimales Beispiel erstellen könnten, das wir ausführen könnten, um das von Ihnen beschriebene Problem zu sehen. Wie Sie es beschrieben haben "wenn es nicht gelingt, eine Übereinstimmung des Benutzers in einer der Zeilen in der CSV-Datei zu finden, sollte es den Code unter dieser Anweisung ausführen" klingt für mich richtig. Ich vermute, dass das Problem nicht diese Zeile ist, sondern die Eingabe in diese Zeile (z. B. "Daten", "Benutzer"). Aber ich kann nicht sicher ohne ein minimales Beispiel wissen – mgilson

Antwort

0

Das Problem, das Sie haben, ist, dass data ein Iterator ist, keine Sequenz, die Sie mehrmals durchlaufen können. Nachdem Sie any mit einem Generatorausdruck aufgerufen haben, der über data iteriert, werden einige oder alle Elemente verbraucht. Spätere Aufrufe werden nur sehen, was übrig ist (was nichts sein kann, wenn die erste Iteration alle Daten überprüfen musste).

Sie können das Problem mit einem viel einfacheren Stück Code reproduzieren:

iterator = iter(range(10)) # an iterator over the numbers 0 through 9 

first_result = any(x == 3 for x in iterator) # this will be True 
second_result = any(x == 3 for x in iterator) # the same expression will be False this time! 

Der ersten any Anruf verbraucht (über den Generator Ausdruck) die Zahlen 0 durch 3 vom Iterator. Dann hört es auf und any gibt True zurück (früher auf diese Weise zu stoppen ist als "Kurzschluss" bekannt).

Der zweite Aufruf any ruft nur die verbleibenden Elemente zu konsumieren, es kann nicht diejenigen, die bereits auf den ersten any Aufruf zurückgegeben wurden. Da der Iterator nur eine 3 liefert, wird der zweite any Aufruf False zurückgeben, nachdem er den Rest der Zahlen verbraucht hat.

Damit Ihr Code ordnungsgemäß funktioniert und data ein Iterator ist, können Sie ihn nur einmal durchlaufen.

Wenn in Ihrer csv Datei nicht zu viele Werte vorhanden sind, können Sie alle Zeilen besser in eine Liste einlesen, die Sie so oft wiederholen können, wie Sie möchten. Versuchen:

data = list(csv.reader(f)) 

Es könnte sinnvoll sein, die Daten in eine sinnvollere Datenstruktur zu analysieren, aber anstatt eine Liste (zB einen Wörterbuch Zuordnung von Benutzername, um Passwörter, die Sie in O(1) Zeit statt O(N) Zeit nicht abfragen) .

Verwandte Themen