python中带有csv文件的任意()函数,其行为与I';我期待着

python中带有csv文件的任意()函数,其行为与I';我期待着,python,python-2.7,csv,any,Python,Python 2.7,Csv,Any,(我现在正在使用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循环的任意名称,

(我现在正在使用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供任何人查看:

哦,不要担心csv文件中的“密码”,它们当然是假的


感谢您的帮助。谢谢

您遇到的问题是,
数据
是迭代器,而不是可以多次迭代的序列。在使用生成器表达式在
数据
上迭代调用
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
调用(通过生成器表达式)使用迭代器中的数字
0
3
。然后它停止并且
any
返回
True
(以这种方式提前停止称为“短路”)

第二次
any
调用只会消耗剩余的项目,它看不到第一次
any
调用已经生成的项目。由于迭代器只会产生一个
3
,因此第二个
任何
调用将在使用剩余的数字后返回
False

为了使代码能够正确地使用
数据
作为迭代器,您只能对其进行一次迭代

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

data = list(csv.reader(f))

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

如果您能创建一个最小的示例,我们可以运行它来查看您所描述的问题,那将是非常理想的。正如您所描述的,“如果它在csv文件的任何一行中都找不到匹配的用户,它应该在该语句下运行代码”听起来对我来说是正确的。我怀疑问题不在于此行,而在于此行的输入(例如,
数据
用户
)。但如果没有一个简单的例子,我就不能确定