Wert teilen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Sid1974
User
Beiträge: 1
Registriert: Montag 9. Dezember 2019, 14:46

Hallo

Vorab schonmal ich hab noch keine Grundlegenden erfahrungen mit Python.
Brauche allerdings für meine Umschulung eine kurze Hilfe bei einem Python Script.

Ich habe folgendes Problem.

Es gibt eine Datei in der ein Temperaturwert übergeben wird.
Dieser Wert ist allerdings zu groß und müsste vor dem übergeben an die Datenbank erst nochmal durch 1000 geteilt werden.
Da ich selbst nach 3 Tagen googlen immer noch Fragezeichen um die Birne habe meine Frage ob jemand so nett wäre mir zu helfen.
Der Code sieht momentan folgendermaßen aus.

#!/usr/bin/python
import MySQLdb
import commands
from time import *

import mysql.connector


temp = commands.getoutput("cat /sys/bus/w1/devices/28-020192462697/w1_slave")
temp = temp[temp.index('t=')+2:]
lt = localtime()
date = strftime("%Y-%m-%d %H:%M:%S",lt)
sql = "insert into Temperatur (datum,sensor,daten) values ('" + date + "','sensor','" + temp + "');"




cnx = mysql.connector.connect(host="192.168.0.63", user='',passwd="", database='temp')
cursor = cnx.cursor()

cursor.execute(sql)
emp_no = cursor.lastrowid

cnx.commit()

cursor.close()
cnx.close()

Ansich funktieriert es super
Wert wird in Datenbank geschrieben nur halt nicht so wie ich ihn bräuchte.
Wie oben schon erwähnt bräuchte ich den Wert halt geteilt bevor er in die DB kommt.

Vielen Dank Sid
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Ich würde dir zu allererst mal empfehlen sensible Daten wie Usernames und Passwörter nicht einfach so im Source Code zu lassen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte in Zukunft Code-Tags verwenden, damit man die in Python relevanten Einrückungen erkennen kann. Dazu im vollstaendigen Editor den </>-Knopf druecken, nachdem man den Quelltext markiert hat.

Statt ein externes Modul einzubinden um nichts anderes zu machen als eine Datei einzulesen, mach das direkt:

Code: Alles auswählen

with open('/sys/bus/w1/devices/28-020192462697/w1_slave') as inf:
      input_data = inf.read()
Um den eigentlichen Wert aus den Daten zu bekommen wuerde ich etwas simpler vorgehen (unter der Annahme, das sieht zB so aus "t1=1345"):

Code: Alles auswählen

input_data = input_data.split("=", 1)[1]
Da du den Wert wohl als Fliesskommazahl weiterverarbeiten willst, ist alles, was fehlt, ein simples

Code: Alles auswählen

temp = float(input_data)
um mit einer Zahl weiter arbeiten zu koennen. Die kann dann zB durch 1000 geteilt werden bevor sie in die Datenbank geschrieben wird.
Sirius3
User
Beiträge: 18260
Registriert: Sonntag 21. Oktober 2012, 17:20

Python2 sollte nicht mehr benutzt werden. Variablennamen nicht Abkürzen temp -> temperature, lt -> current_time, cnx -> connection, etc.
NIEMALS SQL-Statements per + oder Stringformatierung erzeugen, dafür gibt es Platzhalter. Bei MySQLdb ist das %s. Achso, MySQLdb wird gar nicht benutzt! Bei mysql.connector ist es das selbe.

Was ist das für ein Datumsformat? Am besten Das Datum von der Datenbank ausfüllen lassen und immer als Type "TIMESTAMP WITH TIMEZONE" wählen.
Die Datenbank ist mit `temp` auch falsch benannt. Solch eine Datenbank würde ich alle paar Tage löschen.
`emp_no` für einen Sensorwert ist auch aus einem Beispiel schlecht kopiert. Wird auch gar nicht benutzt.

Code: Alles auswählen

#!/usr/bin/python3
import mysql.connector

DB_HOST = "192.168.0.63"
DB_USER = ""
DB_PASSWORD = ""
DB_DATABASE = "temp" # TODO: better name
INSERT_SENSOR = "insert into Temperatur (datum, sensor, daten) values (NOW(), 'sensor', %s)"

with open("/sys/bus/w1/devices/28-020192462697/w1_slave") as data:
    temperature = float(data.read().rsplit("t=", 1)[-1])

connection = mysql.connector.connect(host=DB_HOST, user=DB_USER, passwd=DB_PASSWORD, database=DB_DATABASE)
cursor = connection.cursor()
cursor.execute(INSERT_SENSOR, [temperature])
connection.commit()
cursor.close()
connection.close()
Antworten