Seite 1 von 1

Datenimport aus CSV in PostgreSQL

Verfasst: Dienstag 17. Oktober 2006, 15:59
von BoOnOdY
hy ich wollte aus einer CSV datei, die mehrere Spalten hat und 2 Werte pro Spalte arbeiten und die in ne Tabelle lesen .
Deutschland;0049
und so weiter ... hab dazu den Quelltext geschrieben

Code: Alles auswählen

import psycopg2 
import csv 
import datetime 


# Datenbank-Connection und -Cursor erstellen 
conn = psycopg2.connect(user = "tim", password = "changeme", database = "GB") 
cur = conn.cursor() 
# CSV-Datei öffnen
f = file("E:\AEP\destination.csv", "r") 

# CSV-Datei dem Parser übergeben 
csvdata = csv.reader(f, delimiter = ';') 

# Jede, nicht leere, Zeile durchlaufen 
for row in ( row for row in csvdata if row ): 
    # 
    # Daten vorbereiten (in den korrekten Datentyp umwandeln) 
    # 
    data = []
    data.append(row[0]) 
    data += [row[1]] 
    
    # Daten in DB schreiben 
    # 
    sql = """ 
    INSERT INTO call ( 
      name,
 dialcode 
    ) VALUES ( 
        %s,%s 
    ) 
    
     
      """ 
    
    conn.commit() 

# CSV-Datei schließen 
f.close() 
 
# Datenbankverbindung trennen 
conn.close()
und diese Datenbank

Code: Alles auswählen

CREATE TABLE destination
(
  identify serial NOT NULL,
  name varchar(50),
  destination varchar(50),
  CONSTRAINT destination_pkey PRIMARY KEY (identify)
) 
WITHOUT OIDS;
ALTER TABLE destination OWNER TO tim;

sieht einer einen Fehler, warum das Python tool mir nichts in meine Datenbank schreibt? Bin glaub ich gerade ziehmlich blind.
Oder diesen "data"befehl nicht drauf habe ??
Gruß Tim

Verfasst: Dienstag 17. Oktober 2006, 16:34
von BlackJack
Du schreibst die Daten nicht in die Datenbank. Du musst die SQL-Anweisung auch ausführen und zwar mit der `execute()` Methode auf dem Cursor. Also ungefähr so:

Code: Alles auswählen

    cur.execute(sql, row)
`data` kannst Du ganz weglassen. `row` ist schon eine Sequenz von Werten.

Kommen in der CSV Datei Leerzeilen vor? Wenn nicht, dann kannst Du die ``for``-Schleife vereinfachen und den Generatorausdruck weglassen. Oder gleich die Schleife weglassen und `executemany()` benutzen.

Verfasst: Dienstag 17. Oktober 2006, 18:37
von BoOnOdY
Hy,

Ergo:

Code: Alles auswählen

import psycopg2 
import csv 
import datetime 


# Datenbank-Connection und -Cursor erstellen 
conn = psycopg2.connect(user = "tim", password = "changeme", database = "GB") 
cur = conn.cursor() 
# CSV-Datei öffnen
f = file("E:\AEP\destination.csv", "r") 

# CSV-Datei dem Parser übergeben 
csvdata = csv.reader(f, delimiter = ';') 

 cur.execute(sql, row)
    
    # Daten in DB schreiben 
    # 
    sql = """ 
    INSERT INTO call ( 
      name,
 dialcode 
    ) VALUES ( 
        %s,%s 
    ) 
    
     
      """ 
    
    conn.commit() 

# CSV-Datei schließen 
f.close() 
 
# Datenbankverbindung trennen 
conn.close()
da es keine leeren zeilen gibt ???

Verfasst: Dienstag 17. Oktober 2006, 18:53
von BlackJack
Nicht wirklich. Was ist denn hier `row`? Und Du benutzt `sql` *bevor* Du es an die Zeichenkette gebunden hast.

Wenn Du die Schleife nicht schreiben möchtest dann musst Du `executemany()` benutzen.

Code: Alles auswählen

cur.executemany(sql, csvdata)