2016-12-27 8 views
0

現在、2つのCSVファイルを比較して、file1.csvの最初の列のIPアドレスがfile2.csvの行にあるかどうかを確認しようとしています。 Python 3.6。アドレスはFILE2内にある場合、私は2つのファイルのセットアップ1.ファイルに同一の新しいファイルにコピーし、その行の2番目の列の値を必要とする次のようになります。2つのCSVファイルの一致する列値を使用してデータを結合した新しいファイルを作成する

ファイル1:

XX.XXX.XXX.1,Test1 
XX.XXX.XXX.2,Test2 
XX.XXX.XXX.3,Test3 
XX.XXX.XXX.4,Test4 
XX.XXX.XXX.5,Test5 
XX.XXX.XXX.6,Test6 
XX.XXX.XXX.7,Test7 
XX.XXX.XXX.8,Test8 

and so on 

をファイル2:

XX.XXX.XXX.6, Name6 
XX.XXX.XXX.7, Name7 
XX.XXX.XXX.8, Name8 

私はこのように見えるようにresult.csvファイルが必要になります。私が持っている

XX.XXX.XXX.1,Test1, Not found 
XX.XXX.XXX.2,Test2, Not found 
XX.XXX.XXX.3,Test3, Not found 
XX.XXX.XXX.4,Test4, Not found 
XX.XXX.XXX.5,Test5, Not found 
XX.XXX.XXX.6,Test6,Name6 
XX.XXX.XXX.7,Test7,Name7 
XX.XXX.XXX.8,Test8,Name8 

コードこれまでのところ、次のようになります。

import csv 

f1 = open('file1.csv', 'r') 
f2 = open('file2.csv', 'r') 
f3 = open('results.csv', 'w') 

c1 = csv.reader(f1) 
c2 = csv.reader(f2) 
c3 = csv.writer(f3) 

file2 = list(c2) 

for file1_row in c1: 
    row = 1 
    found = False 
    for file2_row in file2: 
     results_row = file1_row 
     x = file2_row[3] 
     if file1_row[1] == file2_row[1]: 

     results_row.append('Found. Name: ' + x) 
     found = True 
     break 
    row += 1 
if not found: 
    results_row.append('Not found in File1') 
c3.writerow(results_row) 

f1.close() 
f2.close() 
f3.close() 

このコードでは、値ではない同一の行をチェックしています。 IP列と隣接する列の両方が両方のファイルで等しいことが必要であり、さらにファイルの行1、行2、行3などの両方に一致する必要があるため、何も一致しませんが、他のもので一致を見つけるために、行をインデックスで比較しないでください。

答えて

0

Iは、行+ = 1

import csv 

f1 = open('file1.csv', 'r') 
f2 = open('file2.csv', 'r') 
f3 = open('results.csv', 'w') 

c1 = csv.reader(f1) 
c2 = csv.reader(f2) 
c3 = csv.writer(f3) 

file2 = list(c2) 

for file1_row in c1: 
    row = 1 
    found = False 
    results_row = file1_row #Moved out from nested loop 
    for file2_row in file2:   
     x = file2_row[1] 
     if file1_row[0] == file2_row[0]: 
      results_row.append(x) 
      found = True 
      break 
    row += 1 
    if not found: 
     results_row.append('Not found')  
    c3.writerow(results_row) 

f1.close() 
f2.close() 
f3.close() 
+0

これは完全に機能しました。ありがとうございました! –

0

パンダ溶液:

import pandas as pd 

df1 = pd.read_csv('file_1.csv', names=['a', 'b']) 
df2 = pd.read_csv('file_2.csv', names=['a', 'b']) 
merged = pd.merge(df1, df2, on='a', how='outer') 
merged.to_csv('results.csv', header=False, index=False, na_rep='Not found') 

コンテンツresults.csvの:

XX.XXX.XXX.1,Test1,Not found 
XX.XXX.XXX.2,Test2,Not found 
XX.XXX.XXX.3,Test3,Not found 
XX.XXX.XXX.4,Test4,Not found 
XX.XXX.XXX.5,Test5,Not found 
XX.XXX.XXX.6,Test6, Name6 
XX.XXX.XXX.7,Test7, Name7 
XX.XXX.XXX.8,Test8, Name8 
0

近い液後results_rowおよび変更インデントの位置を移動させます次のようになります:

with open('result.csv', 'w') as out: 
    with open('file1.csv', 'r') as f1, open('file2.csv', 'r') as f2: 
     f2_lines = [line for line in f2.readlines() if len(line) > 1] 
     f1_lines = [line for line in f1.readlines() if len(line) > 1] 
     for line in f1_lines: 
      val = 'Not found' 
      b = [line.split(',')[0].strip() in item for item in f2_lines] 
      if any(b): 
       val = f2_lines[b.index(True)].split(',')[1].strip() 
      out.write('{}, {}\n'.format(line.strip(), val)) 

出力:

XX.XXX.XXX.1,Test1, Not found 
XX.XXX.XXX.2,Test2, Not found 
XX.XXX.XXX.3,Test3, Not found 
XX.XXX.XXX.4,Test4, Not found 
XX.XXX.XXX.5,Test5, Not found 
XX.XXX.XXX.6,Test6, Name6 
XX.XXX.XXX.7,Test7, Name7 
XX.XXX.XXX.8,Test8, Name8 
+0

このコードを使用しようとしましたが、実際には正確な一致を提供しますが、不正確なものも提供します。一部の名前は複数回一致しました。私が投稿したファイルの内容は、私が所有しているIPのリストの小さなサンプルなので、小規模には表示されないかもしれませんが、.103で終わるIPに対応する名前もまた、 1に一致する名前がありませんでした。 –

+0

私はそれがループの問題だと思っています、おそらくそれは値を保持し、次にそれを次のオープンスペースに割り当てますか? –

0

ここで(あなたがPythonの3.xを使用していると仮定)非パンダのソリューションです:

import csv 

present = {} 
with open('file2.csv', 'r', newline='') as file2: 
    reader = csv.reader(file2, skipinitialspace=True) 
    for ip, name in reader: 
     present[ip] = name 

with open('file1.csv', 'r', newline='') as file1, \ 
    open('results.csv', 'w', newline='') as results: 
    reader = csv.reader(file1, skipinitialspace=True) 
    writer = csv.writer(results) 
    for ip, name in reader: 
     writer.writerow([ip, name, present.get(ip, ' Not found')]) 

ファイルResults.csv

XX.XXX.XXX.1,Test1, Not found 
XX.XXX.XXX.2,Test2, Not found 
XX.XXX.XXX.3,Test3, Not found 
XX.XXX.XXX.4,Test4, Not found 
XX.XXX.XXX.5,Test5, Not found 
XX.XXX.XXX.6,Test6,Name6 
XX.XXX.XXX.7,Test7,Name7 
XX.XXX.XXX.8,Test8,Name8 
+0

私はPython 3.6を使用しています、私の謝罪、私は質問で指定する必要があります。 –

関連する問題