log parsen REGEX Zeilen SQLITE übergeben

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
wannabe
User
Beiträge: 7
Registriert: Dienstag 30. November 2010, 13:27

hab ich, danke fürs Antworten

Code: Alles auswählen

if not match: continue
		version,value = match.groups() #[1]
		print version,value
0.0.0 06026104
1.6.1 0.1501
1.8.1 02484.796

Code: Alles auswählen

version,value = match.groups() #[1]
		print value
06026104
0.1501
02484.796
(die eigentlichen Werte)

Code: Alles auswählen

version,value = match.groups() #[1]
		mylist.append(value)

for item in mylist:
	t = (item)
	print t[0:3]
bringt:
060
0.1
024
Python hat die Werte in Tabelle organisiert und statt Zeilen werden Werte in Spalten gewertet?

Übrigens funktioniert in meinem heutigen Beitrag zumindest die Zuweisung der Ergebnisse in SQLITE in ganzen "Strings", aber eben nicht korrekt.
Wert 1: 06026104
steht so in Zeile1 Spalte1 dann aber wieder in Zeile2 Spalte2 und Zeile3 Spalte3
Wert 2: 0.1501
taucht erstes mal in Zeile4 Spalte1 dann in Zeile5 Spalte2 wieder usf.

Logisch, daß geünscht ist, Wert1 in Spalte namens "Sernr"; Wert2 in Spalte "peak" und so weiter eingetragen wird.
BlackJack

@wannabe: Wenn die drei Einträge in `mylist` eine Zeile in der Datenbank ergeben sollen, dann verstehe ich nicht warum Du versuchst die in einer Schleife einzeln in die DB zu schreiben und dann auch noch nacheinander in alle drei Datenspalten!? Das ist doch total unsinnig!?

Die Bedingung mit dem `match` davor würde ich übrigens umdrehen. Also nicht testen ob kein Treffer und dann ``continue``, sondern testen ob Treffer und dann den Wert an die Liste anhängen. Wobei `mylist` kein guter Name ist.

Das ``t = (item)`` ist sinnfrei. Sowohl die Zuweisung an sich von einem nichtssagenden Namen an einen anderen nichtssagenden Namen, als auch die Klammern.

Wenn Du *einen* Datensatz eintragen willst, dann mach das mit *einem* ``INSERT``. Darin so viele Platzhalter wie Werte in die Zeile eingetragen werden sollen, und als Argument dann eine Liste mit so vielen Werten wie Platzhalter da sind.
wannabe
User
Beiträge: 7
Registriert: Dienstag 30. November 2010, 13:27

Hier das Gesamtskript:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*- 

import serial
import time
import re
import sqlite3

# serielle USB-Schnittstelle öffnen
ser = serial.Serial()
ser.baudrate = 300
ser.port = /dev/ttyUSB0    
ser.timeout = 2
ser.parity = serial.PARITY_EVEN
ser.stopbits = serial.STOPBITS_ONE
ser.bytesize = serial.SEVENBITS
ser.open()

# Zählerabfrage initiieren mit /?!
ser.write("/?!")
time.sleep(0.001)                    #1ms war im cutecom eingestellt und hat funktioniert
ser.write("\r")                    #CR LF?

# sqlite Einbindung vorbereiten
connection = sqlite3.connect(w"/var/httpdocs/dabaPyTest.s3db")
cursor = connection.cursor()
extrakt = []

#theoretisch sollte nun Zähler antworten
ser.readlines(eol='!') = z   
for line in z:
		match = re.search(r'(0\.0\.0|1\.6\.1|1\.8\.1)\(([0-9\.]+)', line)
		if match: 
			version,value = match.groups() 
			extrakt.append(value)
#print extrakt
cursor.execute('INSERT INTO energielog (sernr, peak, kwh) values (?, ?, ?)', extrakt)

ser.close()
cursor.close()
connection.close()
so klappt zumindest des Parsen des Logfiles und Einsortieren in SQLite.

Vielen, vielen Dank für die Hilfe und Hinweise, auch wenn ich mich mitunter sehr angestellt habe. Waren es doch meine ersten Python-Gehversuche.
(code verbessert - Dank für die Tips - hab ich weitere syntaxfehler übersehen? - Ich bin mir vor allem unsicher was ser.readlines anbelangt, obgleich ich vom Gefühl her meine es klappt so)
Zuletzt geändert von wannabe am Dienstag 7. Dezember 2010, 10:40, insgesamt 1-mal geändert.
BlackJack

@wannabe: Öhm, das enthält mindestens drei Syntaxfehler, lässt sich also nicht übersetzen.

Die Objekte würde ich enger "gruppieren", also nicht ganz am Anfang schon die Verbindung zur Datenbank aufbauen und `extrakt` definieren wo das doch gegen Ende erst benötigt wird.

Die Attribute von `serial` kann man auch dem Konstruktoraufruf schon mitgeben.

Die 1.0 (Sekunden) passen nicht zum Kommentar (Millisekunden).

Wofür steht `fp`? Ist zumindest in C eine übliche Abkürzung für "file pointer" -- das passt semantisch nicht zu einer Liste mit Zeichenketten.

`cursor` und `connection` werden in der falschen Reihenfolge geschlossen.
Antworten