2016-08-09 7 views
2

私はまだPythonには新しく、このコードをthis postから私に適合させようとしています。2つの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さんの投稿への彼の応答マルタインピータースにより投稿されたコードいじり、彼のコードは私をそこに向かわせてくれます。代わり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]) 

私はmasterlist.csvとhosts.csvファイルから対応する行に引っ張ることができる方法、マッチング署名を示し、内2つを連結します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

にマージ? 'join'シェルコマンドはこれを既に行います。 (また、実行している操作の名前は "join"です。これはリレーショナルデータベースでは本当に一般的です)。 –

答えて

3

使用pandas.read_csv、あなたは、Pythonを使用する必要があります "署名" 欄

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") 
関連する問題