2016-07-09 10 views
-1

Ich versuche, eine Charge von CSV sind in PostgreSQL zu importieren und ständig mit fehlenden Daten in ein Problem laufen:eine Reihe von CSV mit Python zu entfernen, wenn die Daten nicht in einer Spalte aufgezeichnet wurden

psycopg2.DataError: missing data for column "column_name" CONTEXT:
COPY table_name, line where ever in the CSV that data wasn't
recorded, and here are data values up to the missing column
.

Es gibt Es gibt keine Möglichkeit, den kompletten Satz von Daten zeitweise in die Zeile zu schreiben, und ich muss mit den Dateien so umgehen, wie sie sind. Ich versuche, einen Weg zu finden, die Zeile zu entfernen, wenn Daten in keiner Spalte aufgezeichnet wurden. Hier ist, was ich habe:

file_list = glob.glob(path) 

for f in file_list: 
    filename = os.path.basename(f) #get the file name 
    arc_csv = arc_path + filename #path for revised copy of CSV 

    with open(f, 'r') as inp, open(arc_csv, 'wb') as out: 
     writer = csv.writer(out) 
     for line in csv.reader(inp): 
      if "" not in line: #if the row doesn't have any empty fields 
       writer.writerow(line) 

    cursor.execute("COPY table_name FROM %s WITH CSV HEADER DELIMITER ','",(arc_csv,)) 
+0

Da ich eine Wiederholung von weniger als 15 habe meine Post-Score für die Antworten nicht zeigen. Danke Cant und Alecxe! – Jeff

Antwort

0

Sie Pandas verwenden könnten Zeilen mit fehlenden Werten zu entfernen:

import glob, os, pandas 

file_list = glob.glob(path) 

for f in file_list: 
    filename = os.path.basename(f) 
    arc_csv = arc_path + filename 
    data = pandas.read_csv(f, index_col=0) 
    ind = data.apply(lambda x: not pandas.isnull(x.values).any(), axis=1) 
    #^provides an index of all rows with no missing data 
    data[ind].to_csv(arc_csv) # writes the revised data to csv 

Dies könnte jedoch langsam, wenn du bist Arbeiten mit großen Datensätzen.

BEARBEITEN - hinzugefügt index_col=0 als Argument zu pandas.read_csv(), um das hinzugefügte Indexspaltenproblem zu verhindern. Dies verwendet die erste Spalte in der CSV als einen vorhandenen Index. Ersetzen Sie 0 durch die Nummer einer anderen Spalte, wenn Sie Grund haben, die erste Spalte nicht als Index zu verwenden.

+0

Danke! Scheint genau richtig, außer dass es eine neue Spalte (Spalte A) mit den nummerierten Zeilen (0 - letzte Zeile #) erstellt. Lesen Sie jetzt mehr über Pandas. – Jeff

+0

Mein Fehler, mein Post bearbeitet, um das zusätzliche Spaltenproblem zu verhindern. Pandas-Datenrahmen erfordern einen Index. Wenn dieser nicht angegeben wird, wird ein neuer Index erstellt. – olegsson

+0

Danke nochmal. Ich habe mich sehr bemüht, Pandas zu lesen und hier sind Sie in kürzester Zeit mit einer Antwort! Ich lese auch zu dem Thema, das Alecxe mir zur Kenntnis gebracht hat. – Jeff

0

Leider Sie nicht Tabellen- oder Spaltennamen parametrieren. Verwenden Sie String-Formatierung, aber stellen Sie sicher, zu validieren/Flucht der Wert richtig:

cursor.execute("COPY table_name FROM {column_name} WITH CSV HEADER DELIMITER ','".format(column_name=arc_csv))