Hallo liebe Forumsmitglieder,
ich bin ein Python Frischling und habe eine Frage zum Import einer csv. Datei.
Die Verknüpfung zur Datenbank funktioniert einwandfrei, nur die Daten bekomme ich leider nicht
in meine mysql Tabelle.
with open('test.csv', "rt") as ifile:
read = csv.reader(ifile)
for row in read:
cursor.execute("INSERT INTO personen2 (name,vorname,personalnummer) VALUES(%s, %s, %s)", row)
Guten Morgen zusammen,
"personalnummer" ist erstmal ein Zahl um zu testen, ob ich überhaupt in die Datenbank schreiben kann.
Wenn das funktioniert möchte ich mich weiter heran tasten.
# Connector importieren
import sys
import mysql.connector
# csv Modul importieren
import csv
# Verbindung zur Datenbank auf dem Datenbankserver erstellen
try:
connection = mysql.connector.connect (host = "localhost", user = "root", passwd = "", db = "firma")
except:
print ("Keine Verbindung zum Server")
sys.exit(0)
# Execution-Objekt erzeugen
cursor = connection.cursor()
# Datensatz erzeugen
#sql = "INSERT INTO personen VALUES('Mustermann', 'Max', 10009)"
#cursor.execute(sql)
# Daten aus csv Datei einlesen
with open('test.csv', "rt") as ifile:
read = csv.reader(ifile)
for row in read:
cursor.execute("INSERT INTO personen2 (name,vorname,personalnummer) VALUES(%s, %s, %s)", row)
connection.commit()
# Execution-Objekt schliessen
cursor.close()
# Verbindung schliessen
connection.close()
Nun erhalte ich folgende Fehlermeldung:
"Not enough parameters for the SQL statement")
mysql.connector.errors.ProgrammingError: Not enough parameters for the SQL statement
Zuletzt geändert von Anonymous am Mittwoch 8. März 2017, 10:15, insgesamt 1-mal geändert.
Grund:Quelltext in Python-Codebox-Tags gesetzt.
@tz_wuerzburg: die Fehlermeldung heißt so viel wie, dass INSERT 3 Parameter braucht, row aber weniger hat. Im Endeffekt bedeutet das wohl, dass Deine csv-Datei weniger als 3 Spalten hat.
Das Trennzeichen war kein Komma sondern ein Semikolon. Problem gelöst.
Gibt es denn eine einfache Möglichkeit den Import auf "TAB" oder "Semikolon" umzustellen?
Hey Leute, ich habe gerade diesen Beitrag gefunden und hoffe irgendjemand liest hier noch.. ich habe ein kleines Problem das ich alleine als Python Einsteiger noch nicht lösen kann.. vielleicht findet sich ja jemand der mir dabei helfen kann. Ich versuche eine csv Datei in meine Datenbank einzulesen.. aber leider bekomme ich in der vorletzen Zeile einen Fehler mit dem ich nichts anfangen kann, im Internet habe ich mich auch schon ein bisschen dazu belesen aber dadurch werde ich nur noch mehr verwirrt.. Aber lange rede kurzer Prozess ich schicke einfach mal meinen Code hier rein plus Fehlermeldung:
import csv
import mysql.connector
verbindung = mysql.connector.connect(host="Localhost",user="root",passwd="",db="litkon")
cursor = verbindung.cursor()
sql_befüllung ="""
INSERT INTO kunden
(Anzahl_der_Lizenzen,Aktive_Lizenzen,Benutzer,Lizenztyp,Ablaufdatum,Lizenzbeschreinung)
VALUES(%s,%s,%s,%s,%s,%s)"""
with open("C:\\Users\\benne\\Desktop\\Pythonprojekte\\CSVDateien\\Lizenzen.csv") as csvdatei:
csv_reader_object = csv.reader(csvdatei, delimiter=';')
with mysql.connector.connect(host="Localhost",user="root",passwd="",db="litkon") as verbindung:
cursor.executemany(sql_befüllung, csv_reader_object)
verbindung.commit()
verbindung.close()
Fehlermeldung:
Traceback (most recent call last):
File "D:\Codes\Fertiges Programm\1. Versuch.py", line 27, in <module>
with mysql.connector.connect(host="Localhost",user="root",passwd="",db="litkon") as verbindung:
AttributeError: __enter__
zu dem Code nochmal ganz kurz, ich habe die Tabelle in meiner Datenbank selbsterzeugt da mein Code immer mit der Syntax gemeckert hatte und ich habe keine Ahnung warum.. ich habe schon kleinere Tabellen selbst erstellt mit Python und diese auch mit Python befüllt.. aber sowas automatisiert aus einer csv Datei ist meine nächste Herrausforderung.
Ich bedanke mich schon mal im Voraus für für vielleicht geleistete Hilfe
@GajeeRedfox: Offenbar kann man das Ergebnis von `mysql.connector.connect()` nicht als Kontextmanager mit ``with`` verwenden. Die DB API V2 garantiert das auch nicht, auch wenn das bei einigen Implementierungen so geht. Also muss man da entweder mit ``try``/``finally`` arbeiten oder `contextlib.closing()` benutzen um ``with`` verwenden zu können.
Wobei da ja auch vorher schon eine Verbindung erstellt wird in dem Code die dann nicht sauber geschlossen wird.
Das `csv`-Modul liefert Zeichenketten für die Werte in den Datensätzen. Die Datenbank erwartet aber teilweise andere Datentypen. Es kann sein, dass das zufällig so funktioniert, aber sauber und robust ist es nicht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman