Daten aus CSVin MySQL schreiben

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
Qwerty
User
Beiträge: 7
Registriert: Sonntag 1. März 2020, 15:59

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
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

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)
Qwerty
User
Beiträge: 7
Registriert: Sonntag 1. März 2020, 15:59

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)
Qwerty
User
Beiträge: 7
Registriert: Sonntag 1. März 2020, 15:59

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
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

Du benutzt pymysql? Da ist der Platzhalter %s nicht {}.
Qwerty
User
Beiträge: 7
Registriert: Sonntag 1. März 2020, 15:59

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

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?
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich verwende ja gerne SQLAlchemy um solche Probleme zu vermeiden. 🙂
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Qwerty
User
Beiträge: 7
Registriert: Sonntag 1. März 2020, 15:59

Vorher habe ich es mit python mysql connector versucht...
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

Was sollen denn jetzt die {}? Die sind doch immer noch falsch.
Qwerty
User
Beiträge: 7
Registriert: Sonntag 1. März 2020, 15:59

Es funzt! Super!
Vielen Dank dafür.
Jetzt kann ich weiter basteln :D
Antworten