2016-08-09 56 views
2

我還是一位新來的Python,我試圖從this post改編此代碼以便爲我工作。比較兩個CSV文件並搜索相似的項目

該帖子和我正在尋找的東西之間的區別在於,我希望在兩個文件中找到匹配的「簽名」時,連接來自hosts.csv和masterlist.csv的匹配行的全部內容。

所以,如果hosts.csv是這樣的:

Path Filename Size Signature 
C:\  a.txt  14kb
D:\  b.txt  99kb 678910 
C:\  c.txt  44kb 111213 

而且masterlist.csv是這樣的:

Signature Name State 
Joe  CT 
567890  Sue  MA 
111222  Dan  MD 

與馬亭皮特斯在他的SERK的響應後發佈的代碼修改一下,他的代碼使我獲得了大部分途徑。

import time, csv 
timestr = time.strftime("%Y%m%d_%H%M") 
outputfile = "Results_" + (timestr) + ".csv" 

    with open('masterlist.csv', 'rb') as master: 
     master_indices = dict((r[0], i) for i, r in enumerate(csv.reader(master))) 

    with open('hosts.csv', 'rb') as hosts: 
     with open('results.csv', 'wb') as results:  
      reader = csv.reader(hosts) 
      writer = csv.writer(results) 

      writer.writerow(next(reader, []) + ['RESULTS']) 

      for row in reader: 
       index = master_indices.get(row[3]) 
       if index is not None: 
        message = 'FOUND in (row {})'.format(index) 
       else: 
        message = 'NOT FOUND' 
       writer.writerow(row + [message]) 

而不是僅僅增加爲SERK一直在尋找,結果列表示匹配的簽名,我怎麼能拉從masterlist.csv和hosts.csv文件中相應的行並連接兩者結合起來的results.csv文件?所需的輸出文件應該是這樣的:

Path Filename Size RESULTS   Signature Name State  
C:\  a.txt  14kb FOUND in Row 1Joe CT 
D:\  b.txt  99kb FOUND in Row 2 678910  Sue MA 
C:\  c.txt  44kb NOT FOUND  111213 

在此先感謝,對這裏的響應已經幫助我最我一直在尋找的解決方案!

+0

你有使用Python合併嗎? 'join' shell命令已經做到了。 (另外,您所做的操作的名稱是「連接」,這在關係數據庫中非常常見。) –

回答

3

使用pandas.read_csv和 「簽名」 欄

import pandas as pd 

hosts_df = pd.read_csv("hosts.csv ") 
masterlist_df = pd.read_csv("masterlist.csv") 
results = masterlist_df.merge(hosts_df, on="Signature", how="outer") 
results.to_csv("results.csv")