在csv文件中打印行时,如何在执行if语句时一次迭代整个csv而不是一行?例如:
import csv
nameid = raw_input("ID please")
with open('cards.csv', 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for row in reader:
row = list(row)
if nameid == row[0]:
print row
else:
print "sorry"
使用此csv:
101,8
102,10
103,5
104,0
将仅使用第一行,然后使用第二行,依此类推,在4次中给出一个错误的声明3。所以,如果我搜索" 102"在我的raw_input中,它将打印:
"sorry"
['102', '10']
"sorry"
"sorry
答案 0 :(得分:0)
每次都没有给你一个虚假陈述。您正在迭代csv并检查每一行的第一个元素与输入。如果不匹配,请打印“抱歉”。如果是,则打印该行。
如果您只想在找不到匹配项时打印“抱歉”消息,请删除您的else子句。相反,设置一个布尔标志,该标志初始化为false,并且只有在找到匹配项时才设置为true。迭代完成后,如果布尔值仍然为假,则只打印'sorry'消息。
答案 1 :(得分:0)
您实际上非常接近您的预期功能。您不希望为每个不匹配的行打印“抱歉”,因此您不希望else
阻止它在哪里。但如果文件中没有任何内容匹配,您确实要打印“抱歉”。事实证明,您只需将else
阻挡在左侧的一个级别上,并使其与for
块而不是if
相对应。你还需要一个额外的一行:
import csv
nameid = raw_input("ID please")
with open('cards.csv', 'rb') as csvfile:
reader = csv.reader(csvfile, delimiter=',')
for row in reader:
row = list(row)
if nameid == row[0]:
print row
break
else:
print "sorry"
现在只有在else
块运行完成时才会触发for
块(有关此语法的更多信息here)。要确保在没有匹配项时它只运行完成,请添加break
以在看到匹配项时立即退出循环。