2016-05-13 56 views
2

(我現在使用python 2.7) 所以也許我不理解這行代碼是如何工作的,因爲對於一個我的程序的一部分,它似乎工作正常,而在另一部分,它沒有。任何()函數與python中的csv文件不行爲如何我期待它

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

基本上,我有我讀取和在變量「數據」存儲這樣csv文件:

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

變量「用戶」是從一個項框中的字符串在Tkinter中, 和變量「line」是for循環的任意名稱,就像在一段代碼中說的「對於我在範圍內(69):」

因此,我的大腦認爲這條線應該做的是,如果它無法在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是一個迭代器,而不是您可以迭代多次的序列。在調用any時,如果生成器表達式在data上迭代,則某些或所有項目將被消耗。後來的調用只會看到剩下的部分(如果第一次迭代必須檢查所有數據,則可能沒有任何結果)。

您可以重現該問題與代碼更簡單一點:

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調用(經由發電機表達式)數字0通過3從迭代器消耗。然後它停止並且any返回True(以這種方式提前停止被稱爲「短路」)。

第二個any調用只消耗剩餘的項目,它看不到已經屈服於第一個any調用的調用。由於迭代器只會產生一個3,因此在使用其餘數字後,第二個any調用將返回False

爲使您的代碼與data正確工作,您只能迭代一次。

如果csv文件中的值不是太多,最好將所有行讀入列表中,您可以根據需要多次迭代。嘗試:

data = list(csv.reader(f)) 

這可能是有意義的數據解析成一個更有意義的數據結構,雖然,而不是一個列表(例如一個字典映射的用戶名到密碼,您可以在O(1)時間查詢,而不是O(N)時間) 。

相關問題