python 中带有 csv 文件的 any() 函数不符合我的预期

any() function with csv file in python not behaving how I'm expecting it to

(我现在使用的是 python 2.7) 所以也许我不明白这行代码是如何工作的,因为对于我的程序的一部分,它似乎工作正常,而在另一部分,它却没有。

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

基本上,我有一个 csv 文件,我正在读取它并将其存储在变量 "data" 中,如下所示:

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

变量"user"是来自Tkinter输入框的字符串, 并且变量 "line" 是 for 循环的任意名称,就像在一段代码中说 "for i in range(69):"

所以我的大脑认为这一行应该做的是,如果它在 csv 文件的任何行中找不到匹配的用户,它应该 运行 该语句下的代码。但它似乎并没有这样做!

但是,稍后在我的代码中我尝试了类似的东西:

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

这似乎没有任何问题!! 我不知道为什么,而且我在互联网上找不到任何其他人试图这样做的地方,哈哈。

我正在尝试制作一个登录表单作为初学者项目,因为我有点了解 python,所以我想看看我能做什么,但我似乎被困在这里。

我已经将我的代码上传到 github 以供任何人查看: https://github.com/Arunscape/login-form/blob/master/login.py

哦,不用担心 csv 文件中的 "passwords",它们当然是假的!

感谢任何帮助。谢谢!!!

你遇到的问题是 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。然后它停止并且 any returns True(以这种方式提前停止被称为 "short circuiting")。

第二个 any 调用只能消耗剩余的项目,它看不到第一个 any 调用已经产生的项目。由于迭代器只会产生一个 3,第二个 any 调用将在消耗完其余数字后 return False

为了让您的代码在 data 作为迭代器的情况下正常工作,您只能迭代一次。

如果您的 csv 文件中没有太多值,您最好将所有行读入一个列表,您可以根据需要迭代任意多次。尝试:

data = list(csv.reader(f))

不过,将数据解析为更有意义的数据结构可能更有意义,而不是列表(例如,将用户名映射到密码的字典,您可以在 O(1) 时间内查询而不是 O(N) 时间).