2016-09-28 4 views
0

Dies wird eine Datei result.csv:Python-Datei Matching und Anhänge

M11251TH1230 
M11543TH4292 
M11435TDS144 

Dies ist eine weitere Datei sample.csv:

M11435TDS144,STB#1,Router#1 
M11543TH4292,STB#2,Router#1 
M11509TD9937,STB#3,Router#1 
M11543TH4258,STB#4,Router#1 

Kann ich ein Python-Programm schreiben sowohl die Dateien zu vergleichen und wenn Zeile in result.csv stimmt mit dem ersten Wort in der Zeile in sample.csv überein, dann appendiere 1 sonst append 0 an jede Zeile in sample.csv?

+0

* 1 anhängen sonst anhängen 0 * - sollte es so aussehen wie 'M11435TDS144, STB # 1, Router # 11 M11543TH4292, STB # 2, Router # 11' nach anhängt? – RomanPerekhrest

+0

Nein sollte es wie M11435TDS144, STB # 1, Router # 1,1 und M11543TH4258, STB # 4, Router # 1,0 aussehen, da M11543TH4258 nicht in result.csv gefunden wird –

+0

Ja, Sie können ein Programm schreiben. Bitte versuche es zumindest * und * schreibe selbst Code und poste es dann. Es spielt keine Rolle, ob es noch Probleme gibt oder ob Sie eine Frage haben, wir können das beantworten. Stack Overflow ist nicht hier, um Ihren Code für Sie zu schreiben. – MichielB

Antwort

0

Der folgende Code-Snippet für Sie arbeiten wird

import csv 

with open('result.csv', 'rb') as f: 
    reader = csv.reader(f) 
    result_list = [] 
    for row in reader: 
     result_list.extend(row) 
with open('sample.csv', 'rb') as f: 
    reader = csv.reader(f) 
    sample_list = [] 
    for row in reader: 
     if row[0] in result_list: 
      sample_list.append(row + [1]) 
     else: 
      sample_list.append(row + [0] 
with open('sample.csv', 'wb') as f: 
    writer = csv.writer(f) 
    writer.writerows(sample_list) 
+0

'f.close()' ist nicht erforderlich und wird in der Tat ein sein Fehler als 'mit' selbst wird sich um das Schließen des Dateizeigers kümmern :-) – thiruvenkadam

0
import pandas as pd 

d1 = pd.read_csv("1.csv",names=["Type"]) 
d2 = pd.read_csv("2.csv",names=["Type","Col2","Col3"]) 
d2["Index"] = 0 

for x in d1["Type"] : 
    d2["Index"][d2["Type"] == x] = 1 

d2.to_csv("3.csv",header=False) 

Anbetracht "1.csv" und "2.csv" Ihre CSV-Eingabedateien sind und "3.csv" ist das Ergebnis, das Sie benötigt

0

die Lösung unter Verwendung csv.reader und csv.writer (csv Modul):

import csv 

newLines = [] 
# change the file path to the actual one 
with open('./data/result.csv', newline='\n') as csvfile: 
    data = csv.reader(csvfile) 
    items = [''.join(line) for line in data] 

with open('./data/sample.csv', newline='\n') as csvfile: 
    data = list(csv.reader(csvfile)) 
    for line in data: 
     line.append(1 if line[0] in items else 0) 
     newLines.append(line) 

with open('./data/sample.csv', 'w', newline='\n') as csvfile: 
    writer = csv.writer(csvfile) 
    writer.writerows(newLines) 

Der sample.csv Inhalt:

M11435TDS144,STB#1,Router#1,1 
M11543TH4292,STB#2,Router#1,1 
M11509TD9937,STB#3,Router#1,0 
M11543TH4258,STB#4,Router#1,0 
+0

Hallo Roman, vielen Dank für die Antwort. Jedes Mal, wenn ich den Code ausführe, bleibt er anhängig. Anstatt an sample.csv anzuhängen, kann ich die letzte Spalte immer wieder neu schreiben, wenn der Code ausgeführt wird. –

+0

Hallo, mein Code überschreibt den Dateiinhalt 'sample.csv' bei jeder Ausführung. Kein anhängen. Überprüfen Sie Ihren Code auf korrekte Dateiöffnung im "Write" -Modus. Die entscheidende Zeile ist 'mit open ('./ data/sample.csv', 'w', newline = '\ n') als csvfile:' – RomanPerekhrest

+0

Hallo Roman, Vielen Dank für die Antwort. Es gibt "TypeError: 'newline' ist ein ungültiges Keyword-Argument für diese Funktion" und jedes Mal, wenn es an eine sample.csv-Datei anfügt, anstatt es neu zu schreiben –

0

mit nur einer Spalte, frage ich mich, warum Sie es als result.csv gemacht. Wenn es keine weiteren Spalten mehr gibt, würde eine einfache Dateileseoperation ausreichen. Zusammen mit der Konvertierung der Daten von result.csv in das Wörterbuch wird auch im Schnelllauf helfen.

result_file = "result.csv" 
sample_file = "sample.csv" 

with open(result_file) as fp: 
    result_data = fp.read() 
    result_dict = dict.fromkeys(result_data.split("\n")) 
    """ 
    You can change the above logic, in case you have very few fields on csv like this: 
    result_data = fp.readlines() 
    result_dict = {} 
    for result in result_data: 
     key, other_field = result.split(",", 1) 
     result_dict[key] = other_field.strip() 
    """ 

#Since sample.csv is a real csv, using csv reader and writer 
with open(sample_file, "rb") as fp: 
    sample_data = csv.reader(fp) 
    output_data = [] 
    for data in sample_data: 
     output_data.append("%s,%d" % (data, data[0] in result_dict)) 

with open(sample_file, "wb") as fp: 
    data_writer = csv.writer(fp) 
    data_writer.writerows(output_data)