2016-07-19 87 views
0

我目前使用Python 2.6。我需要編寫一個腳本來讀取'master'csv文件,然後將第二個csv文件中的條目與主文件進行匹配以確定其有效性。主CSV文件和輔助CSV文件具有相同數量的列,每個列中具有相似的值。我試圖循環遍歷輔助csv文件中的每個條目,然後將它們與主csv中的每個條目進行匹配。如果輔助csv文件中的給定條目與主csv中的任何條目相匹配,則該條目將被視爲有效。使用python驗證csv中基於主csv文件的條目

主CSV文件看起來是這樣的:

ID_A,ColumnB,ID_C,ColumnD 
1,text,0,words 
1,text,1,words 
2,text,A,words 
3,text,CC,words 

凡「ID」值所駕駛的驗證過程和「列」值是輔助性的。首先,我需要將這個主csv放入內存中,以便我可以比較來自輔助csv的條目。爲此,我試圖將csv讀入字典。然後我遍歷每一行,但只能真正弄清楚如何打印這些值。

with open ('master.csv') as csvfile: 
    masterReader = csv.DictReader(csvfile) 
    for row in masterReader: 
     print(row['ID_A'], row['ID_C']) 

而不只是閱讀和打印這些文件,我需要找出一種方法來將它們存儲在內存中,所以我可以在二級CSV對條目加以比較,它看起來像這樣:

ColumnA,ColumnB,ID_C,ID_D 
text,words,160,7 
text,words,250,BB 
text,words,1,0 
text,words,15,A 

其中ID_C與主ID_A進行比較,ID_D與主ID_C進行比較。我認爲最好先對master-ID_A進行測試,因爲如果沒有匹配,那麼對master-ID_C進行測試就沒用了。

我試過使用另一篇文章的方法,我發現here和(comparing varied CSV files in python),但似乎無法得到我想要的結果。

我想創建一個具有兩個獨立函數的類,它們將讀取主csv,然後根據輸入ID值驗證輔助csv中的條目。我還希望能夠更改輸入主控(具有相同的格式)和輔助csv,以便腳本可以用於多個數據集。當輔助條目被驗證時,我想看到(ID_C,ID_D,Valid)。

我希望這是有道理的,我一直在熬夜。讓我知道,如果我可以在這裏澄清任何東西

回答

0

因此,看看你的2個問題零件。
將主人讀入內存。使用字典理解讀者的整個主文件中與row['ID_A']的關鍵,例如:

with open('master.csv') as csvfile: 
    reader = csv.DictReader(csvfile) 
    master = {row['ID_A']: row for row in reader} 

以及第二個問題是如何給二次CSV比較反對這個主列表,再次使用列表理解與保護是很簡單:

with open('secondary.csv') as csvfile: 
    reader = csv.DictReader(csvfile) 
    result = [(row['ID_C'], row['ID_D'], 'Valid') for row in reader 
       if row['ID_C'] in master and master['ID_C']['ID_C'] == row['ID_D']] 

警衛檢查該master字典鍵(ID_A)相匹配的ID_C,如果一個鍵存在檢查master:ID_C == ID_D且僅當這兩個都是True和它的result列表。

打印出result將列出所有ID_CID_D從主列表匹配ID_AID_C這一點。

我會把它作爲練習讓讀者把它們放到課堂上。

0

,你可以讀取主文件到一組(ID_A, ID_C)元組。當你確認只是檢查,如果元組(ID_C, ID_C)中存在:

import csv 

class Validator(object): 
    def read_master(self, master): 
     with open(master) as f: 
      reader = csv.DictReader(f) 
      self.master = set((row['ID_A'], row['ID_C']) for row in reader) 

    def validate(self, csv_file): 
     with open(csv_file) as f: 
      reader = csv.DictReader(f) 
      keys = ((row['ID_C'], row['ID_D']) for row in reader) 
      return [list(key) + [key in self.master] for key in keys] 

    def validate_key(self, id_c, id_d): 
     return (id_c, id_d) in self.master 

用法:

from pprint import pprint 
v = Validator() 
v.read_master('master.csv') 
pprint(v.validate('other.csv')) 
print v.validate_key('1', '1') 
print v.validate_key('1', '2') 

輸出:

[['160', '7', False], 
['250', 'BB', False], 
['1', '0', True], 
['15', 'A', False]] 
True 
False 
+0

感謝您的真棒答案!我有一個關於如何微調第二個功能的問題。如果不是輸入輔助csv來驗證所有條目,我只想傳遞個別值「ID_C」和「ID_D」?難道是這樣的:'高清驗證(自我,ID_C,ID_D):鍵=(ID_C,ID_D)返回[列表(鍵)+在self.master [關鍵]的鍵鍵]'? – lastLeafFallen

+0

@lastLeafFallen我添加了關於如何驗證單個密鑰的示例。 – niemmi

+0

好極了,我想現在實現和我一直在這條線得到一個語法錯誤:'self.master = {(行[「ID_A」],行[「ID_C」])爲讀者排}'我的調試器不斷指出語法錯誤在單詞「for」的「o」和「r」之間。任何想法爲什麼? – lastLeafFallen