2017-01-12 2 views
2

Ich habe zwei Dateien:Python-Skript zum automatischen hinzufügen wenige auf einen String

1.csv

1,2 
3,4 

2.csv

1,2,4,5 
5,6,7,8 

Die zweite Spalte von 1.csv sein sollte in der 2.csv letzten Spalte als Ausgabe angehängt.

Wunsch Ausgabe lautet:

1,2,4,5,2 
5,6,7,8,4 

Das Skript ist:

import csv 

d_1 = {} 

with open('1.csv') as f_1: 
    for row in csv.reader(f_1): 
     d_1[row[0]] = row[1:] 

with open('2.csv') as f_2, open('out.csv', 'wb') as f_out: 
    csv_out = csv.writer(f_out) 

    for row in csv.reader(f_2): 
     if row[0] in d_1: 
      row.extend(d_1[row[0]]) 

     csv_out.writerow(row) 

aber von diesem Skript ist es nicht die zweite Spalte von 1.csv mit dem Ausgang anhängt

+0

Druck aus dem [Wörterbuch] (https://docs.python.org/3/tutorial/datastructures.html#dictionaries) 'd_1' und Sie werden verstehen, was in Ihrem Skript vor sich geht. – user2314737

+0

Warum in aller Welt haben Sie die Beispiele für Eingabe und Ausgabe entfernt ??? –

Antwort

0

Hier Ein Pandas-Ansatz. Warten Sie, andere eingehende Antworten, wenn Sie nicht verwenden Pandas wollen:

import pandas as pd 

df1 = pd.read_csv(csv1, header=None) #give the file path of csv1 
df2 = pd.read_csv(csv2, header=None) #give the file path of csv2 

df2[df2.columns[-1]+1] = df1[1] 
df2.to_csv('new_csv', header=None, index=None) 
0

Sie Code wurde die falsche Index verwenden, versuchen Sie dies:

import csv 

d_1 = [] 
with open('1.csv') as f_1: 
    for row in csv.reader(f_1): 
     d_1.append(row[1:]) 

with open('2.csv') as f_2, open('out.csv', 'wb') as f_out: 
    csv_out = csv.writer(f_out) 

    for i, row in enumerate(csv.reader(f_2)): 
     row.extend(d_1[i])  
     csv_out.writerow(row) 
0

Sie Code fehlschlägt, weil es, dass die erste davon ausgegangen, Feld für jede Datei ist ein Schlüssel - während es nicht ist.

import csv 

d_1 = [] 

with open('1.csv') as f_1: 
    for row in csv.reader(f_1): 
     d_1.append(row[1:]) 

with open('2.csv') as f_2, open('out.csv', 'wb') as f_out: 
    csv_out = csv.writer(f_out) 

    for i, row in enumerate(csv.reader(f_2)): 
     row.extend(d_1[i]) 

     csv_out.writerow(row) 

Aber man konnte lesen Sie auch eine Zeile von beiden Eingabedatei und schreiben die Verkettung zur Ausgabedatei bei jeder Iteration:

Eine einfache Lösung wäre eine einfache Liste anstelle Ihres dict zu benutzen, :

with open("1.csv") as f_1, open("2.csv") as f_2, open("out.csv", 'wb') as f_out: 
    csv_out = csv.writer(f_out) 
    csv1 = csv.reader(f_1) 
    csv2 = csv.reader(f_2) 

    try: 
     while True: 
      row1 = next(csv1) 
      row2 = next(csv2) 
      row2.extend(row1[1:]) 
      csv_out.writerow(row2) 
    except StopIteration: 
     pass 
Verwandte Themen