2016-08-09 22 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")