CSV mit Python in Datenbank schreiben

Max-Berater

Erfahrenes Mitglied
Code in Pycharm ausgeführt

import mysql.connector
import csv
with open('C:\\Users\\xxxxxx\\OneDrive\\privat\\python//REKO.csv', newline='') as csvfile:
csvreader = csv.reader(csvfile, delimiter=';')

## Zugriff auf DB vorbereiten:

cnx = mysql.connector.connect(
host="xxxxx.de",
user="xxxxxx",
password="xxxxxxxxxx",
database="dbxxxxxxxx94ca"
)


cursor = cnx.cursor()
for row in csvreader:
# jetzt steht dir eine Zeile aus der CSV-Datei in der Variablen row zur Verfügung

# SQL bereit stellen:
sql = ("INSERT INTO REKO"
"(col1, col2)"
"VALUES (%(val1)s, %(val2)s")
# Daten bereit stellen:
data = {'val1': row[0],'val2': row[1]}
cursor.execute(sql, data);
cnx.commit()
cursor.close()
cnx.close()

C:\Users\xxxxxxxxx\PycharmProjects\xxxxxxx\venv\Scripts\python.exe C:\Users\49152\PycharmProjects\xxxxxxxx\tutorials.py
File "C:\Users\xxxxxxxxxx\PycharmProjects\xxxxxxxxx\tutorials.py", line 17
for row in csvreader:
IndentationError: unexpected indent

Process finished with exit code 1
 

Technipion

Erfahrenes Mitglied
Code in Pycharm ausgeführt

import mysql.connector
import csv
with open('C:\\Users\\xxxxxx\\OneDrive\\privat\\python//REKO.csv', newline='') as csvfile:
csvreader = csv.reader(csvfile, delimiter=';')

## Zugriff auf DB vorbereiten:

cnx = mysql.connector.connect(
host="xxxxx.de",
user="xxxxxx",
password="xxxxxxxxxx",
database="dbxxxxxxxx94ca"
)


cursor = cnx.cursor()
for row in csvreader:
# jetzt steht dir eine Zeile aus der CSV-Datei in der Variablen row zur Verfügung

# SQL bereit stellen:
sql = ("INSERT INTO REKO"
"(col1, col2)"
"VALUES (%(val1)s, %(val2)s")
# Daten bereit stellen:
data = {'val1': row[0],'val2': row[1]}
cursor.execute(sql, data);
cnx.commit()
cursor.close()
cnx.close()
IndentationError: unexpected indent

Process finished with exit code 1
Das ist ja komisch. In dem Code den du gepostet hast sind ja gar keine Einrückungen. Wieso sich der Python-Interpreter also darüber aufregt ist mir wirklich ein Rätsel.
 

Max-Berater

Erfahrenes Mitglied
Code:
import mysql.connector

import csv

with open('C:\\Users\\xxxxx\\PycharmProjects\\shareanalysis\\files\\TEST.csv', newline='') as csvfile:

csvreader = csv.reader(csvfile, delimiter=';')



## Zugriff auf DB vorbereiten:



cnx = mysql.connector.connect(

host="xxxx-xxxx.de",

        user="xx",

        password="xx",

        database="xx"

)





cursor = cnx.cursor()

for row in csvreader:

# jetzt steht dir eine Zeile aus der CSV-Datei in der Variablen row zur Verfügung



        # SQL bereit stellen:

        sql = ("INSERT INTO TEST"

              "(col1, col2)"

              "VALUES (%(val1)s, %(val2)s")

# Daten bereit stellen:

        data = {'val1': row[0],'val2': row[1]}

cursor.execute(sql, data);

cnx.commit()

cursor.close()

cnx.close()

File "C:\xxxx\xxx\PycharmProjects\shareanalysis\tutorials.py", line 17, in <module>
for row in csvreader:
ValueError: I/O operation on closed file.

Process finished with exit code 1

Auch wenn ich den Code anders strukturiere, bekomme ich stets Fehlermeldungen. Ich finde einfach den Fehler nicht, was hier nicht funktioniert. Habe es auch in Colab versucht, nun in Pycharm, aber immer ohne Erfolg.
 

Sempervivum

Erfahrenes Mitglied
Ich sehe da ein Problem mit den Einrückungen:
Code:
import mysql.connector

import csv

with open('C:\\Users\\xxxxx\\PycharmProjects\\shareanalysis\\files\\TEST.csv', newline='') as csvfile:

csvreader = csv.reader(csvfile, delimiter=';')
Die letzte Zeile muss eingerückt werden, damit Du dich in dem Block des with befindest:

Code:
import mysql.connector

import csv

with open('C:\\Users\\xxxxx\\PycharmProjects\\shareanalysis\\files\\TEST.csv', newline='') as csvfile:

    csvreader = csv.reader(csvfile, delimiter=';')
Auch der Code, der folgt, muss ebenfalls um eine Stufe eingerückt werden.
 

Max-Berater

Erfahrenes Mitglied
Code:
import mysql.connector
import csv
with open('C:\\Users\\49152\\PycharmProjects\\shareanalysis\\files\\TEST.csv', newline='') as csvfile:
    csvreader = csv.reader(csvfile, delimiter=';')

    ## Zugriff auf DB vorbereiten:

    cnx = mysql.connector.connect(
        host="xx-xx.de",
        user="xx",
        password="xxxx",
        database="xxx"
                            )

    cursor = cnx.cursor()
    for row in csvreader:
        # jetzt steht dir eine Zeile aus der CSV-Datei in der Variablen row zur Verfügung

        # SQL bereit stellen:
        sql = ("INSERT INTO TEST"
              "(col1, col2)"
              "VALUES (%(val1)s, %(val2)s")
        # Daten bereit stellen:
        data = {val1=row[0], val2=row[1]}
        cursor.execute(sql, data);
cnx.commit()
cursor.close()
cnx.close()

File "C:\Users\49152\PycharmProjects\shareanalysis\tutorials.py", line 24
data = {val1=row[0], val2=row[1]}
^
SyntaxError: invalid syntax

Process finished with exit code 1
 

Max-Berater

Erfahrenes Mitglied
Danke für den Tipp

data = {val1 =row[0], val2 =row[1]}


data = {val1 =row[0], val2 =row[1]}
^
SyntaxError: invalid syntax

Process finished with exit code 1
 

Max-Berater

Erfahrenes Mitglied
Code:
import mysql.connector
import csv
with open('C:\\Users\\49152\\PycharmProjects\\shareanalysis\\files\\TEST.csv', newline='') as csvfile:
    csvreader = csv.reader(csvfile, delimiter=';')
    cnx = mysql.connector.connect(
        host="f-ffff.ff",
        user="fff",
        password="fffff",
        database="ffff")
    cursor = cnx.cursor()
    for row in csvreader:
        sql = ("INSERT INTO TEST"
               "(col1, col2)"
               "VALUES (%(val1)s, %(val2)s)")

    data = {'val1': row[0], 'val2': row[1]}
    cursor.execute(sql, data)
cnx.commit()
cursor.close()
cnx.close()

Habe es soweit hinbekommen, jedoch erscheint immer nur die letzte Reihe in der Datenbank. Hier Dorf Karl.

Hab ich hier nen Fehler im Programm.


Meine CSV-LISTE
Meiser​
Hans​
Müller​
Gerd​
Klein​
Dieter​
Dorf​
Karl​
 

Sempervivum

Erfahrenes Mitglied
Ja, da ist noch ein Fehler drin, Du musst alle Zeilen ab der Definition von data eine Stufe weiter einrücken:
Code:
import mysql.connector
import csv
with open('C:\\Users\\49152\\PycharmProjects\\shareanalysis\\files\\TEST.csv', newline='') as csvfile:
    csvreader = csv.reader(csvfile, delimiter=';')
    cnx = mysql.connector.connect(
        host="f-ffff.ff",
        user="fff",
        password="fffff",
        database="ffff")
    cursor = cnx.cursor()
    for row in csvreader:
        sql = ("INSERT INTO TEST"
               "(col1, col2)"
               "VALUES (%(val1)s, %(val2)s)")

        data = {'val1': row[0], 'val2': row[1]}
        cursor.execute(sql, data)
    cnx.commit()
    cursor.close()
    cnx.close()
So wie es jetzt ist, wird das Eintragen in die Datenbank nur ein Mal am Ende der Schleife durchgeführt.