2016-08-02 65 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,則僅打印「抱歉」消息。