2016-12-27 1 views
0

Ich versuche derzeit, zwei CSV-Dateien zu vergleichen, um zu prüfen, ob IP-Adressen in der ersten Spalte von file1.csv in file2.csv in einer Zeile sind Python 3.6. Wenn die Adresse in file2 ist, muss ich die zweite Spalte Wert dieser Zeile in eine neue Datei kopiert, die identisch ist 1. Die beiden Datei-Setups wie folgt aussehen Datei:Verwenden von übereinstimmenden Spaltenwerten in zwei CSV-Dateien zum Erstellen einer neuen Datei mit kombinierten Daten

Datei 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 

Datei 2:

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

ich brauche die Result.csv Datei wie folgt aussehen:

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 

Der Code ich habe so weit ist wie folgt:

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() 

Derzeit prüft dieser Code auf identische Zeilen nicht Werte. Das bedeutet, dass nichts passt, da sowohl die IP-Spalte als auch die angrenzende Spalte in beiden Dateien gleich sein müssen. Darüber hinaus stimmt es mit den Zeilen 1, 2, 3 und so weiter überein, aber ich brauche es, um eins zu durchsuchen um die Übereinstimmungen in der anderen zu finden, nicht Zeilen nach Index vergleichen.

Antwort

0

zog ich die Position results_row und geänderten Einrückung nach Reihe + = 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

Das hat perfekt funktioniert. Vielen Dank! –

0

A pandas Lösung:

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') 

Inhalt des 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

Eine enge Lösung zu dem, was Sie versucht haben, wäre wie folgt:

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)) 

Ausgang:

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

Ich habe versucht, mit diesem Code und es bietet zwar die richtigen Übereinstimmungen, aber es bietet auch falsche. Einige Namen wurden mehr als einmal gefunden. Die Dateiinhalte, die ich gepostet habe, sind ein kleiner Ausschnitt aus der Liste der IPs, die ich habe, also war es vielleicht nicht im kleinen Maßstab, aber der Name, der für die IP-Endung in .103 übereinstimmte, zeigte sich auch für die IP-Endung. 1, die keinen passenden Namen hatte. –

+0

Ich denke, es ist ein Problem mit der Schleife, vielleicht hält es den Wert und weist es dann dem nächsten offenen Raum zu? –

0

Hier ist eine nicht-Pandas Lösung (vorausgesetzt, Sie verwenden 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')]) 

Datei 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

Ich benutze Python 3.6, Entschuldigung, ich hätte in der Frage angegeben werden sollen. –

Verwandte Themen