Seite 1 von 1

Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 16:15
von Qwerty
Hallo,

ich bin Python-Neuling und versuche aus einer CSV-Datei die letzte Reihe in eine MySQL Datenbank zu schreiben.
Die Datenbank ist fertig eingerichtet und ich kann auch manuel Daten mit einem python-script einfügen.

Die CSV-Daten sehen so aus:

Code: Alles auswählen

28.882,31.866,21.771,27.671,24.068,30.271,24.5,22.98,30.903,8.8
28.875,31.863,21.781,27.715,24.079,30.279,24.53,23.019,30.915,8.8
28.875,31.866,21.781,27.678,24.101,30.298,24.401,22.864,30.584,9.1
28.869,31.894,21.764,27.659,24.084,30.294,24.482,22.966,30.682,8.92
28.854,31.84,21.776,27.576,24.005,30.259,24.361,22.783,30.608,9.1
Die letzte Reihe der CSV-Datei lese ich so aus:

Code: Alles auswählen

csv_file = scriptsFolder + '/Messwerte.csv'
    fa = open(csv_file, 'r')
    fb = (list(fh)[-1])
    #fc = str(fb)
Dann versuche ich hiermit die Werte der letzten Reihe in die Datenbank zu schreiben:

Code: Alles auswählen

    mySql_insert_query = "INSERT INTO messwerte(wert_1, wert_2, wert_3, wert_4) VALUES ({0}, {1}, {2}, {3})",fb
    cursor = connection.cursor()
    cursor.execute(mySql_insert_query)
Damit kommt es aber zu dieser Fehlermeldung:

Code: Alles auswählen

TypeError: can't concat tuple to bytes
Ich habe schon Stunden gegoogelt und etliche Varianten ausprobiert.
Aber nun habe ich keine Idee mehr, wie ich das Problem lösen kann.
Über Hilfe würde ich mich sehr freuen.

MfG

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 16:32
von Sirius3
Erster Fehler ist, dass fh nicht definiert ist, aber das scheint ja wohl bei Dir zu funktionieren, also zeigst Du nicht den wirklichen Code.
Pfade setzt man nicht mit + zusammen. Variablen schreibt man klein_mit_unterstrich. Und die sollten aussagekräftig sein und nicht nur aus zwei Buchstaben bestehen.
Dateien sollte man auch wieder schließen. csv-Dateien liest man mit dem csv-Modul, weshalb `fb` auch nicht das enthält, was Du für INSERT brauchst.
Und execute erwartet zwei Parameter und nicht ein Tuple.
Wenn man raten müßte, was Du da machst, oder machen solltes:

Code: Alles auswählen

from pathlib import Path
import csv

scripts_folder = Path(__file__).parent
csv_filename = scripts_folder / 'Messwerte.csv'
with csv_filename.open() as lines:
    for row in csv.reader(lines):
        # loop to last row
        pass

cursor = connection.cursor()
cursor.execute("INSERT INTO messwerte(wert_1, wert_2, wert_3, wert_4) VALUES ({0}, {1}, {2}, {3})", row)

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 18:33
von Qwerty
Sorry, ich hatte den Code aus einer anderen Testdatei kopiert.
Es muss heissen:

Code: Alles auswählen

csv_file = scriptsFolder + '/Messwerte.csv'
    fh = open(csv_file, 'r')
    fb = (list(fh)[-1])
    fc = str(fb)

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 19:48
von Qwerty
So, jetzt habe ich das so:

Code: Alles auswählen

import csv
from pathlib import Path
import pymysql

scripts_folder = Path(__file__).parent
csv_filename = scripts_folder / 'Messwerte.csv'
with csv_filename.open() as lines:
    for row in csv.reader(lines):
        pass
    print (row)
    
    mysql_connection = pymysql.connect(
        host='XXX',
        user='XXX',
        password='XXX',
        database='XXX')

    cursor = mysql_connection.cursor()
    cursor.execute("INSERT INTO messwerte(wert_1, wert_2, wert_3, wert_4, wert_5, wert_6, wert_7, wert_8, wert_9, wert_10) VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9})", row)
        
    connection.commit()
    print(cursor.rowcount, "gespeichert")
    cursor.close()
Jetzt haben die Werte aber ' ' um jeden Wert -> print(row):

Code: Alles auswählen

['28.842', '31.991', '21.823', '27.76', '24.03', '30.27', '24.828', '23.075', '31.053', '6.94']
Und es kommt folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/ab/rpi-scripts/test.py", line 27, in <module>
    cursor.execute("INSERT INTO messwerte(wert_1, wert_2, wert_3, wert_4, wert_5, wert_6, wert_7, wert_8, wert_9, wert_10) VALUES ({0}, {1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9})", row)
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/cursors.py", line 168, in execute
    query = self.mogrify(query, args)
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/cursors.py", line 147, in mogrify
    query = query % self._escape_args(args, conn)
TypeError: not all arguments converted during string formatting

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 19:53
von Sirius3
Du benutzt pymysql? Da ist der Platzhalter %s nicht {}.

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 19:59
von Qwerty
Ich hatte da was gelesen, dass der auf { } geändert wurde.
Aber dann ändere ich das wieder zurück.

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 20:13
von Qwerty
Mit

Code: Alles auswählen

VALUES (%s, {%s}, {%s}, {%s}, {%s}, {%s}, {%s}, {%s}, {%s}, {%s})", row)
kommt folgender Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/ab/rpi-scripts/test.py", line 27, in <module>
    cursor.execute("INSERT INTO messwerte(wert_1, wert_2, wert_3, wert_4, wert_5, wert_6, wert_7, wert_8, wert_9, wert_10) VALUES ({%s}, {%s}, {%s}, {%s}, {%s}, {%s}, {%s}, {%s}, {%s}, {%s})", row)
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/cursors.py", line 170, in execute
    result = self._query(query)
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/cursors.py", line 328, in _query
    conn.query(q)
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/connections.py", line 517, in query
    self._affected_rows = self._read_query_result(unbuffered=unbuffered)
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/connections.py", line 732, in _read_query_result
    result.read()
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/connections.py", line 1075, in read
    first_packet = self.connection._read_packet()
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/connections.py", line 684, in _read_packet
    packet.check_error()
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/protocol.py", line 220, in check_error
    err.raise_mysql_exception(self._data)
  File "/home/ab/.local/lib/python3.7/site-packages/pymysql/err.py", line 109, in raise_mysql_exception
    raise errorclass(errno, errval)
pymysql.err.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''28.842'}, {'31.991'}, {'21.823'}, {'27.76'}, {'24.03'}, {'30.27'}, {'24.828'}, ' at line 1")

Kann das jetzt nicht an den Anführungszeichen vor und hinter dem jeweiligen Wert liegen?

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 20:15
von __blackjack__
Ich verwende ja gerne SQLAlchemy um solche Probleme zu vermeiden. 🙂

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 20:21
von Qwerty
Vorher habe ich es mit python mysql connector versucht...

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 20:22
von Sirius3
Was sollen denn jetzt die {}? Die sind doch immer noch falsch.

Re: Daten aus CSVin MySQL schreiben

Verfasst: Sonntag 1. März 2020, 20:29
von Qwerty
Es funzt! Super!
Vielen Dank dafür.
Jetzt kann ich weiter basteln :D