2016-08-11 1 views
0

Der folgende Code ist, um die Daten in File1 aus den Spalten 2, 3, 4, 8 zu lesen und schreiben Sie in NewFile. Die Daten in jeder Spalte 2 (die bereits in temp_list gespeichert ist) sollten in File3 gesucht werden. Falls gefunden, werden die Daten in der dritten Spalte jeder Zeile in File3 mit den in temp_list gespeicherten Daten angehängt. Aber die zweite for Schleife berücksichtigt nur die column2 Daten in der ersten Zeile. In den verbleibenden Zeilen werden die Daten in Spalte 2 nicht berücksichtigt.Wie schreibe ich die Daten in die neue Spalte in bestehenden CSV-Datei mit Python-Skript

Ich gab Drucken var1 in der zweiten Schleife, um zu sehen, ob jede Spalte 2 Daten (kopiert in Newfile) in Betracht gezogen wird. Aber die Ausgabe zeigt nur in der ersten Zeile von File3 Wert. Werte in anderen Zeilen werden nicht gesucht. Kann mir bitte jemand helfen, das Problem in meinem Code zu verstehen?

import csv 

f1 = csv.reader(open("C:/Users/File1.csv","rb")) 
f2 = csv.writer(open("C:/Users/NewFile.csv","wb")) 
f3 = csv.reader(open("C:/Users/File3.csv","rb")) 

for row_f1 in f1: 

    if not row_f1[0].startswith("-"): 

     temp_list = [row_f1[1],row_f1[2],row_f1[3],row_f1[7]] 

     var1 = row_f1[1] 

     for row_f3 in f3: 

      if var1 in row_f3: 

       temp_list.append(row_f3[2]) 


     f2.writerow(temp_list) 

Antwort

0

Eines Ihrer Probleme ist, dass, wenn Sie for row_f3 in f3: lesen Sie die Datei, und es geht nicht um die automatisch beginnen. Eine Option ist es zu lesen, sobald Sie die Zeilen in einer Liste speichern, aber prüfen, ob var1 in einer Liste jedes Mal vorhanden ist, wird sehr langsam sein.

Was ist das Feld in row_f3, wo Sie versuchen, var1 zu finden? Sie können ein Wörterbuch verwenden, wenn die Schlüssel gleich sind:

d = dict() 
for row_f3 in f3: 
    d[row_f3[field_index]] = row_f3[2] 

Und dann:

new_field = d.get(var1) 
    if new_field is not None: temp_list.append(new_field) 

Wie BIGS sind Ihre Dateien? Wenn sie < 1Gb sind, können Sie auch Pandas statt Lesezeile versuchen Zeile:

import pandas as pd 
df1 = pd.read_csv("C:/Users/File1.csv",header=None,index_col=None) 
df1 = df1.loc[~df1[0].str.startswith("-"),[1,2,3,7] 
df1[8] = df1[1].apply(lambda x: d.get(x)) 
df1.to_csv("C:/Users/NewFile.csv",header=None) 
0

Wenn ich deine Beschreibung richtig verstehen, sollte die folgende tun, was Sie wollen. Das Hauptproblem mit Ihrem Code besteht darin, dass er die dritte Datei nicht schließt und erneut öffnet, um die Daten daraus zu lesen und zu kopieren. Da Ihr Code auch über das Schließen von Dateien im Allgemeinen schlampig ist, habe ich dafür gesorgt, indem ich ihn geändert habe, um with Anweisungen zu verwenden, die es automatisch behandeln werden.

import csv 

with open("C:/Users/File1.csv", "rb") as file1, \ 
    open("C:/Users/NewFile.csv", "wb") as file2: 
     f2 = csv.writer(file2) 

     for row_f1 in csv.reader(file1): 
      if not row_f1[0].startswith("-"): 
       temp_list = [row_f1[1], row_f1[2], row_f1[3], row_f1[7]] 
       var1 = row_f1[1] 
       var1_found = False 
       with open("C:/Users/File3.csv", "rb") as file3: 
        for row_f3 in csv.reader(file3): 
         if var1 in row_f3: 
          var1_found = True 
          break 
       if var1_found: 
        with open("C:/Users/File3.csv", "rb") as file3: 
         for row_f3 in csv.reader(file3): 
          temp_list.append(row_f3[2]) 
       f2.writerow(temp_list) 
+0

Bitte lesen Sie [_What sollte ich tun, wenn jemand meine Frage beantwortet? _] (Http://stackoverflow.com/help/someone-answers) – martineau

Verwandte Themen