2015-07-10 210 views
0

我有2個csv文件。我在一個csv中獲取一個單元格的值,並與另一個單元格中的所有值進行比較。以下是我的代碼:python嵌套循環只執行一次

f = open('test1.csv') 
x = open('test2.csv') 

csv_f = csv.reader(f) 
csv_x = csv.reader(x) 

for row in csv_f: 
    a = row[1] 
    b = row[2] 
    for nrow in csv_x: 
     if a in nrow[0] and b in nrow[1]: 
      print nrow[0] 

現在上面的代碼只打印a和b的第一個值。隨後,它不會通過a和b的其他值的2nd for循環。任何想法是什麼問題?

+0

的事情是@anand答案,甚至更好,然後我的,因爲它具有讀取該文件只有一次,你可以用我的,只有當文件大小大 – The6thSense

回答

3

功能

csv_x = csv.reader(x) 

返回一個文件對象。

當你循環它時,它會一直走到最後。

所以你無法遍歷一遍

爲了克服這個問題,你可以用這種方式

f = open('test1.csv') 


csv_f = csv.reader(f) 


for row in csv_f: 
    a = row[1] 
    b = row[2] 
    csv_x = csv.reader(open('test2.csv')) # assign here 
    for nrow in csv_x: 
     if a in nrow[0] and b in nrow[1]: 
      print nrow[0] 
2

是的,正確的,因爲第一個循環,文件x,基於後在其上創建csv的讀取器csv_x位於文件的末尾,並且沒有更多的行要從中讀取,因此它不會在第一次循環之後再次遍歷它。

對於第二個文件(對於性能),可以考慮使用簡單文件,然後在開始任何循環之前創建列表,以便不必一次又一次讀取同一文件。

示例 -

f = open('test1.csv') 
x = open('test2.csv') 

csv_x = csv.reader(x) 
xlist = [i for i in csv_x] #If your csv is delimited by ',' , which I am guessing it is. 

csv_f = csv.reader(f) 

for row in csv_f: 
    a = row[1] 
    b = row[2] 
    for nrow in xlist: 
     if a in nrow[0] and b in nrow[1]: 
      print nrow[0]