2016-05-13 4 views
2

(私は現在Python 2.7を使用しています) このコード行がどのように機能しているのか理解できません。私のプログラムの一環として、うまくいっているようですが、別の部分ではうまくいきません。pythonでcsvファイルを使用してany()関数が動作しない

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

変数「ユーザー」は入力ボックスから文字列は次のとおりです。基本的に

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

は、私は私はこのような読み取りおよび「データ」の変数に格納していますcsvファイルを持っています "for i in range(69)"のようなコードのように、変数 "line"はforループの任意の名前です:

私の脳は、それは、csvファイルのどの行にも一致するユーザーが見つからないと、その文の下でコードを実行する必要があります。しかし、それはそうしていないようです!

しかし、後で私のコードで私は似たような試す:

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

を、これは何の問題もなく動作しているようです! 私はなぜ、そして私はインターネット上の誰かがこの笑をしようとしているのを見つけることができませんでした。

私は初心者のプロジェクトとしてログインフォームを作ろうとしています。私はPythonを多少知っているので、私は何ができるか見たいと思っていましたが、ここではこだわっているようです。

私は誰が確認するためのGitHubに私のコードをアップロードしています https://github.com/Arunscape/login-form/blob/master/login.py

ああとcsvファイルで「パスワード」を心配しないでください、彼らはもちろん偽のです!

何か助けていただければ幸いです。ありがとう!!!

+2

あなたが記述している問題を見るために実行できる最小限の例を作成できるのであれば理想的です。あなたがそれを記述したように、「csvファイル内のどの行にも一致するユーザーが見つからない場合は、その文の下のコードを実行する必要があります。私はこの問題がこの行ではなく、この行への入力(例えば、 'data'、' user')であると信じています。しかし、私は最小限の例がなければ確かに分かりません – mgilson

答えて

0

問題はdataがイテレータであり、複数回繰り返すことはできません。 dataを反復するジェネレータ式でanyを呼び出した後、そのアイテムの一部またはすべてが消費されます。後の呼び出しで残っているものだけが表示されます(最初の反復ですべてのデータをチェックしなければならない場合は何もありません)。

あなたは、コードのはるかに簡単なビットで問題を再現することができます

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! 

(ジェネレータ式を経由して)最初anyコールが消費番号03までは、イテレータから。その後、それが停止し、を返します(このように早く停止することを「短絡」といいます)。anyTrueを返します。

第2のanyコールだけが残りのアイテムを消費しますが、最初のanyコールにすでに送信されたコールは表示されません。イテレータは1つだけ3を生成するので、2番目のanyコールは残りの数字を消費した後にFalseを返します。

dataがイテレータであるためにコードが正しく動作するようにするには、一度しか反復処理ができません。

csvファイルに値が多すぎない場合は、すべての行をリストに読み込むほうがよい場合があります。これを繰り返し行うことで、何度でも繰り返し実行できます。試してみてください:

data = list(csv.reader(f)) 

それはむしろリストよりも、かかわらず、より意味のあるデータ構造にデータを解析するのは意味があります(たとえば、あなたがO(N)時間ではなくO(1)時間で問い合わせることができ、パスワード、マッピングする辞書のユーザ名) 。

関連する問題