2013-10-24 86 views
1

我有一組csv文件和另一個csv文件GroundTruth2010_edited_copy.csv,它包含我想要追加到文件集行的末尾的信息。這些文件包含描述地質樣本的信息。對於包括GroundTruth2010_edited_copy.csv在內的所有文件,每行都有一個識別樣本的標識「rockid」,行的其餘部分描述樣本的各種參數。我想從GroundTruth2010_edited_copy.csv追加相應的信息到csv文件集。也就是說,如果行具有相同的「rockid」,我想將它們合併到新的csv文件中的新行中。因此,Set中的每個原始csv文件都有一個新的csv文件。這是我的代碼。批量使用python將匹配行添加到csv文件

import os 
import csv 
#read in ground truth data 
csvfilename='GroundTruth/GroundTruth2010_edited_copy.csv' 
with open(csvfilename) as csvfile: 
    rocreader=csv.reader(csvfile) 
    path=os.getcwd() 
    filenames = os.listdir(path) 
    for filename in filenames: 
     if filename.endswith('.csv'): 
      #read csv files     
      r=csv.reader(open(filename)) 
      new_data = [] 
      for row in r: 
       rockid=row[-1] 

       for krow in rocreader: 
        entry=krow[0] 
        newentry=entry[:5] +entry[6:] #remove extra '0' from middle of entry 

        if newentry==rockid: 
         print('Ok!') 
         #append ground truth data 
         new_data.append([row, krow[1], krow[2], krow[3], krow[4]]) 

      #write csv files   
      newfilename = "".join(filename.split(".csv")) + "_GT.csv" 
      with open(newfilename, "w") as f: 
       writer = csv.writer(f) 
       writer.writerows(new_data) 

代碼運行,使我的新的CSV文件,但它們都是空的。問題似乎是我的第二個'if'陳述從來都不是真的:控制檯從不打印'Ok!'我嘗試了一下故障排除,並且感到很沮喪。也許最令人沮喪的是,之後的程序完成,如果我進入

rockid==newentry 

控制檯返回「真」,所以在我看來,我應該得到至少一個「好!」進行最後的迭代。任何人都可以幫我找到有什麼問題嗎?

此外,由於我的if語句從不是真的,所以我追加'new_data'的方式可能也有問題。

回答

2

您只需打開rocreader一次,因此當您稍後嘗試在循環中使用它時,第一次只通過循環的其餘部分獲取行 - 在循環的其餘部分中,您正在讀取0行(當然沒有匹配)。要反覆閱讀,每次需要使用時打開並關閉一次。

但不是重新掃描磁盤地面實況文件(慢!)爲行其他每個CSV中的,你應該讀它一旦進入一個字典,所以你可以看一下標識一步到位。

with open(csvfilename) as csvfile: 
    rocreader=csv.reader(csvfile) 
    rocindex = dict((row[-1], row) for row in rocreader) 

則對任意鍵newentry,你可以檢查這樣的:

if newentry in rocindex: 
    truth = rocindex[newentry] 
    # Merge it with the row that has key `newentry` 
+0

是什麼原因,你勸使用字典而不是for循環?我嘗試了兩種方法,發現他們花費的時間相同(不過,我在執行字典方法時正在運行一些其他程序)。這應該是預期的嗎?這是一種風格還是易於編碼的問題?我只是好奇,並不是想說你的方法在任何方面都是錯誤的。 – PatEugene

+0

如果GroundTruth有1000行,並且每行有2000行的10個CSV文件,則您的代碼將讀取GroundTruth 20,000次(每個新行一次)並進行20,000,000次比較;我的代碼讀取一次,並進行20,000次查找。如果你看不出有什麼不同,你的測試一定是太小了,或者你的測量不準確。或者你的代碼仍然不必要地重讀GroundTruth? – alexis

+0

我不明白的是,除了進行1000次比較之外,查找還做了些什麼。如果條目包含在字典中,還能知道其他什麼?當查找發現它正在查找的內容時,查找是否會停止比較? – PatEugene