2012-09-07 84 views
2

我試圖比較兩個csv文件,然後從每個csv文件打印一行上的product_id字段。這是有問題的代碼。需要注意的是,在兩個csv文件中,這些字段的順序不同。python比較兩個csv文件與csv模塊:不遍歷每一行

import csv 
import sys 

f1 = sys.argv[1] 
f2 = sys.argv[2] 
num_matches = 0 

with open(f1, 'rb') as f: 
    csv_readerf = csv.reader(f) 
    csv_readerf.next() 
    with open(f2, 'rb') as n: 
     csv_readern = csv.reader(n) 
     csv_readern.next() 
     for row in csv_readerf: 
      a_name = row[0].replace(" ", "").lower() #not used, can be ommitted 
      a_id = row[1] 
      a_post = row[2] 
      a_rev = row[3] 
      a_loc = row[4]       #not used, can be ommitted 
      a_desc = row[5].replace(" ", "").lower() #remove all whitespaces for uniformity 
      a_ovr = row[6] 
      a_cmf = row[7] 
      a_sty = row[8] 
      a_siz = row[9] 
      a_arc = row[10] 
      a_wid = row[11] 
      a_url = row[12] 
      for rowP in csv_readern: 
       p_name = rowP[10].replace(" ", "").lower() 
       p_id = rowP[6] 

       temp = rowP[11].split(" ")[0:3]  #disregard time stamp 
       p_post = (" ").join(temp) 

       p_rev = rowP[7] 
       if p_rev is "": 
        p_rev = "Anonymous" 
       p_desc = rowP[1].replace(" ", "").replace("\n", "").replace("\r\n", "").lower() 
       p_ovr = rowP[4] 
       p_cmf = rowP[3] 
       p_sty = rowP[0] 
       p_siz = rowP[8] 
       p_arc = rowP[9] 
       if p_arc: 
        p_arc = p_arc[0 : p_arc.index(" ")]  #for arch we only want the first word 
       p_wid = rowP[5] 
       p_url = rowP[2] 

       print a_id, p_id 

我遇到的問題是,在輸出中,這是我傾入.txt文件,並非所有的product_id從F1的打印。我知道這一點,因爲f1是我創建的測試文件,我有意將多個不同ID的產品放在那裏。

另一件需要注意的事情是,我嘗試在單獨的腳本中循環每個csv,並且每個csv都正常工作,按預期打印每個product_id。爲什麼當我嵌入for循環時,迭代第一個文件似乎被縮短了?可能是什麼問題呢?我製作的測試文件很小,因此它們應該能夠很好地適應內存。

+2

你爲什麼把第一內部的第二'for'循環?這可能是你的問題的根源,因爲在這個循環運行一次之後,它會讀到文件的末尾,所以在後續運行時,內部循環將不會運行。 – BrenBarn

+2

將較小的文件讀入字典,然後在讀取較大的文件時循環。 – tripleee

+0

好的,我會試試看。謝謝。但我真的不明白@BrenBarn的評論。它不只是讀取內部文件的文件結尾,而是讀取外部文件的結尾?那麼它不應該繼續? –

回答

1

的錯誤是一樣BrenBam提到你的循環建設

for row in csv_readerf: 
    .... 
    for rowP in csv_readern: 
     # will only work in the first iteration of the outer loop 
     # since the csv reader hits eof 
     ... 

所以只需只比較csv_readerf的第一線與csv_readern

所有行

你會阻止,如果你打開CSV文件外環內側的內環的:

for row in csv_readerf: 
    ... 
    with open(f2, 'rb') as n: 
     csv_readern = csv.reader(n) 
     csv_readern.next()  .... 

     for rowP in csv_readern: 
      # will iterate over csv_readern, but only in the first iteration of the outer loop 

,或者如果你閱讀內文件到一個數組的第一和循環遍歷該

一種很常見的初學者的錯誤,經常發生深層嵌套,使用功能可以幫助