2016-08-02 78 views
0

在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 

将只使用第一行,然后第二行,等等,给我一个虚假陈述3开出4次。所以,如果我在搜索的raw_input为“102”,它会打印:

"sorry" 
['102', '10'] 
"sorry" 
"sorry 

回答

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立即退出循环。

+0

就是这样!我一直在寻找这些信息,感谢您的链接。 – Jason

0

这不是每次给你一个虚假的陈述。您正在遍历csv,并根据输入检查每行的第一个元素。如果不匹配,则显示'抱歉'。如果是,则打印该行。

如果你只想打印一个'抱歉'的消息,如果没有找到匹配,摆脱你的else子句。相反,请设置一个布尔型标志,该标志被初始化为false,并且只有在找到匹配项时才设置为true。迭代完成后,如果布尔值仍然为false,则仅打印“抱歉”消息。