2009-07-21 1 views
5

Ich habe 2 csv-Dateien. Ich muss eine Spalte in einer Datei durch eine Spalte aus der anderen Datei ersetzen, aber sie müssen nach einer ID-Spalte sortiert bleiben.Wie ersetzt man eine Spalte in einer CSV-Datei in Python?

Hier ist ein Beispiel:

file1:

ID, transect, 90mdist          
1, a, 10,             
2, b, 20,             
3, c, 30,  

file2:

ID, transect, 90mdist         
1, a, 50             
2, b, 70              
3, c, 90   

im Grunde habe ich eine neue Datei mit dem richtigen 90mdist und ich brauche es in die alte Datei einfügen aber es muss mit der gleichen ID # übereinstimmen.

Es ist mein Verständnis, dass Python CSV-Dateien als Zeichenfolge behandelt. also kann ich entweder ein Wörterbuch verwenden oder die Daten in eine Liste konvertieren und dann ändern? Welcher Weg ist am besten?

Jede Hilfe würde sehr geschätzt werden !!

+0

in Ihrem Beispiel Datei2 ist bereits Dateien korrigiert, nicht wahr? Du kannst also einfach die Datei umbenennen. – SilentGhost

+0

Da die beiden Dateien den gleichen Satz von ID-Werten und Spalten haben, meinen Sie, dass Sie den ersten vollständig mit dem zweiten überschreiben wollen? Ich bin mir nicht sicher, was Sie mit "Einfügen" dann meinen - vielleicht sind die Beispieldaten schlecht gewählt und Sie können zur Klärung bearbeiten (gewünschte Ausgabe sowie Eingaben)? –

+0

genau duplizieren http://stackoverflow.com/questions/1019200/how-to-replace-a-column-using-pythons-built-in-csv-writer-module – SilentGhost

Antwort

7

Die CSV Module in der Python-Bibliothek ist, was Sie hier brauchen.

Es ermöglicht das Lesen und Schreiben von CSV-Dateien, das Behandeln von Zeilen mit Tupeln oder Listen von Elementen.

Lesen Sie einfach die Datei mit den korrigierten Werten ein, speichern Sie sie in einem Wörterbuch mit der ID der Linie.

Dann lesen Sie in der zweiten Datei, ersetzen die relevante Spalte mit den Daten aus dem Diktat und schreiben Sie in eine dritte Datei.

Fertig.

+0

Beat mich auf den Schlag. –

+2

+1: Schreiben Sie in eine dritte Datei. Versuchen Sie nicht, eine Datei an Ort und Stelle zu aktualisieren. –

0

Sobald Sie Ihre CSV-Listen haben, wäre eine einfache Möglichkeit, eine Spalte in einer Matrix durch eine andere zu ersetzen, die Matrizen zu transponieren, die Zeile zu ersetzen und dann Ihre bearbeitete Matrix zurück zu transponieren. Hier ist ein Beispiel mit Ihren Daten:

csv1 = [['1', 'a', '10'], ['2', 'b', '20'], ['3', 'c', '30']] 
csv2 = [['1', 'a', '50'], ['2', 'b', '70'], ['3', 'c', '90']] 

# transpose in Python is zip(*myData) 
transposedCSV1, transposedCSV2 = zip(*csv1), zip(*csv2) 
print transposedCSV1 
>>> [['1', '2', '3'], ['a', 'b', 'c'], ['10', '20', '30']] 

csv1 = transposedCSV1[:2] + [transposedCSV2[2]] 
print csv1 
>>> [['1', '2', '3'], ['a', 'b', 'c'], ['50', '70', '90']] 

csv1 = zip(*csv1) 
print csv1 
>>> [['1', 'a', '50'], ['2', 'b', '70'], ['3', 'c', '90']] 
0

Wenn Sie nur diese als einmaligen tun, warum mit Python überhaupt die Mühe machen? Excel oder OpenOffice Calc öffnet die zwei CSV-Dateien für Sie, dann können Sie einfach die Spalte ausschneiden und einfügen.

Wenn die zwei Listen der IDs nicht genau die gleichen sind, würde ein einfaches VB-Makro es für Sie tun.

2

Versuchen Sie folgendes:

from __future__ import with_statement 

import csv 

def twiddle_csv(file1, file2): 
    def mess_with_record(record): 
     record['90mdist'] = 2 * int(record['90mdist']) + 30 
    with open(file1, "r") as fin: 
     with open(file2, "w") as fout: 
      fields = ['ID', 'transect', '90mdist'] 
      reader = csv.DictReader(fin, fieldnames=fields) 
      writer = csv.DictWriter(fout, fieldnames=fields) 
      fout.write(",".join(fields) + '\n') 
      reader.next() # Skip the column header 
      for record in reader: 
       mess_with_record(record) 
       writer.writerow(record) 

if __name__ == '__main__': 
    twiddle_csv('file1', 'file2') 

Ein paar Einschränkungen:

  • DictReader die erste Zeile als Daten zu verwenden scheint, auch wenn es die Spiele Felder aus. Rufen Sie reader.next() auf, um zu überspringen.
  • Datenzeilen dürfen keine abschließenden Kommas enthalten. Sie werden als leere Spalten interpretiert.
  • DictWriter scheint die Spaltenüberschriften nicht auszugeben. DIY.
+0

Vielen Dank für das Beispiel. (Zumindest für csv.reader und csv.writer) erfordert das Python-csv-Modul, dass Sie ** Dateien im Binärmodus öffnen ** oder Sie zufällige Zeilenumbrüche erhalten (siehe http://bugs.python.org/issue7198). –

Verwandte Themen