Seite 1 von 1
Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Freitag 8. Mai 2015, 10:39
von trbo
Liebe Pythonfreunde,
ich hätte da mal ein kleines Problem. Also ich habe ein Tool geschrieben, welches bestimmte Daten aus einer sehr langen .txt Datei herausfiltert. Diese will ich jetzt in eine Datenbank einfügen, für einen Datensatz funktioniert das ganze schon, jedoch leider nicht mit der Schleife, so dass das Programm mir alle Daten in die DB einspielt
hier mal der Code
Code: Alles auswählen
#!/usr/bin/env python
from __future__ import print_function
import pymysql.cursors
Journal=open('J_15April.txt')
jrn=Journal.read()
Zeile=jrn.split('14.04.2015')
conn = pymysql.connect(host='localhost', port=3306, user='root',passwd='',db='daten', cursorclass=pymysql.cursors.DictCursor)
cur = conn.cursor()
cur.execute("INSERT INTO lga (ean, smr, uhrzeit) VALUES ('%s','%s','%s')%(ean, smr, uhrzeit)")
row = cur.fetchall()
ean = int(row[0])
smr = char(row[1])
uhrzeit = char(row[2])
for line in Zeile:
if 'BOTTLE_ID' in line:
line2 = line.split(';')
line3 = line2[0].strip(' BOTTLE_UNIQUE: BOTTLE_ID: 0')
uhrzeit = (line3[:-4])
if 'EAN' not in line:
ean = 0
else:
ean = line2[7].strip('EAN: ')
if ' SMR: 1;' in line:
smr = ('gelesen')
else:
smr = ('nicht gelesen')
cur.close()
conn.commit()
conn.close()
wenn ich den code von Zeile 28-45 rauslasse und die Insert Operation entsprechend anpasse kann ich einzeln Datensätze einfügen, nur möchte ich gerne, dass das ganze automatisch abläuft und mir das programm alle Daten in die DB einspielt.
Vielen Dank schonmal für die Hilfe, für jegliche Rückfragen stehe ich natürlich gerne zur verfügung.
Lg
trbo
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Freitag 8. Mai 2015, 10:58
von Sirius3
@trbo: das ganze funktioniert garantiert nicht für auch nur einen Datensatz. So wie das aussieht, ist der Parser auch nicht robust. Du solltest auf jeden Fall nocheinmal nachlesen, was strip macht, das ist nämlich so bestimmt nicht gewollt. Variablen durchzunummerieren ist schlecht, das sind nichtsagenden Namen, die keiner versteht. Magische Indizes sollte man vermeiden. Einige Klammern sind unnötig. Einer Variable sollte möglichst nur einem Datentyp zugeordnet sein. "char" ist nicht definiert. Es gibt in Python eine Namenskonvention, an die Du Dich halten solltest.
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Freitag 8. Mai 2015, 12:06
von trbo
ich habe es aber für einen Datensatz ausprobiert und dieser ist in meiner Datenbank erschienen. Und das mit dem strip ist, auch wenn es vielleicht nicht danach aussieht so gewollt.
ich möchte eigentlich nur wissen, wie der INSERT Befehl verändert werden muss, damit nach und nach die Parameter smr,ean & uhrzeit übergeben werden
dazu habe ich 2 einzelne Codes die alleine das tun was sie sollen, ich schaffe es jecoh nicht diese zu einem funktionsfähigen zusammenzufügen
hier nochmal die beiden einzelnen codes
Code: Alles auswählen
Journal=open('J_15April.txt')
jrn=Journal.read()
Zeile=jrn.split('14.04.2015')
for line in Zeile:
if 'BOTTLE_ID' in line:
line2 = line.split(';')
line3 = line2[0].strip(' BOTTLE_UNIQUE: BOTTLE_ID: 0')
print (line3[:-4])
if 'EAN' not in line:
print ('keine EAN Vorhanden/Fehler')
else:
print(line2[7].strip('EAN: '))
if ' SMR: 1;' in line:
print ('gelesen')
else:
print ('nicht gelesen')
Hier werden die Werte aus der. txt datei gelesen
Code: Alles auswählen
#!/usr/bin/env python
from __future__ import print_function
import pymysql.cursors
conn = pymysql.connect(host='localhost', port=3306, user='root',passwd='',db='daten', cursorclass=pymysql.cursors.DictCursor)
cur = conn.cursor()
cur.execute("INSERT INTO lga (ean, smr, uhrzeit) VALUES ('87654321','gelesen','14:40:34')")
row = cur.fetchall()
cur.close()
conn.commit()
conn.close()
und mit diesem Code habe ich die 3 Werter in die DB eingetragen.
In der Datenbank ist EAN als int, smr und Uhrzeit als char definiert worden.
mfg
trbo
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Freitag 8. Mai 2015, 12:36
von Sirius3
@trbo: wenn strip so gewollt wäre, hättest Du auch "line2[0].strip(' 0:BDEILNOQTU_')" schreiben können, damit man gleich sehen kann, welche Zeichen gelöscht werden, wenn das aber eine Uhrzeit sein soll, dann darf in den ersten 10 Stunden des Tages nichts geschrieben werden, weil das dann weggestript wird. Ist das immer gegeben? Ein fetch nach einem INSERT ist ziemlich sinnfrei.
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Freitag 8. Mai 2015, 13:14
von sparrow
Ich verstehe dein Problem ehrlich gesagt nicht.
Wenn das Schreiben einen Datensatzes funktioniert, dann kapsel das in eine Funktion und lass die Funktion je gelesener Quellzeile einmal aufrufen.
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Freitag 8. Mai 2015, 13:49
von Hyperion
Bei vielen Datensätzen sollte man noch ``executemany`` des DB2-APIs erwähnen...
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Freitag 8. Mai 2015, 14:33
von trbo
sparrow hat geschrieben:Ich verstehe dein Problem ehrlich gesagt nicht.
Wenn das Schreiben einen Datensatzes funktioniert, dann kapsel das in eine Funktion und lass die Funktion je gelesener Quellzeile einmal aufrufen.
Das schreiben eines Datensatzes funktioniert leider nur, wenn ich die Daten manuell eintrage. Sorry aber bin absoluter Anfänger in Python und kann dahr mit vielen Begrifflichkeiten noch nicht so wirklich was anfangen. Bin mir auch im klaren darüber das mein Lösungsweg nicht der eleganteste ist, jedoch ist es mir erstmal wichtig, dass das Programm funktioniert, weshalb ich auch hier gepostet habe.
Ich hoffel lediglich, das mir jemand dabei helfen kann das Programm zum Laufen zu bekommen, da ich es benötige um Daten auszuwerten. Eine Optimierung ist auch noch für einen späteren Zeitpunkt angesetzt aber das steht noch aus. Momentan möchte ich nur das es erstmal so klappt und hoffe mir kann jemand helfen und sagen wo es klemmt
mfg und danke für die Antworten
trbo
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Freitag 8. Mai 2015, 14:52
von BlackJack
@trbo: Wo liegt denn das Problem beim einfügen von Daten die nicht hart in der SQL-Anweisung stehen? Hast Du die relevanten Dokumentationen gelesen? PyMySQL, MySQLdb, und das PEP für die DB-API 2.0? Alleine das Beispiel bei der zugegebenermassen sehr dürftigen ”Dokumentation” (die README.rst) von PyMySQL zeigt doch wie das geht.
Optimierung für einen späteren Zeitpunkt solltest Du vergessen. Mach es gleich richtig. Und hier ging es bisher eigentlich auch nicht um Optimierungen sondern um essentielles. Vernünftige Namen zu verwenden ist keine Optimierung. Und Deine Verwendung von `strip()` ist schlicht falsch weil Du offenbar etwas anderes erwartest als die Methode tatsächlich macht. Das willst Du ganz bestimmt nicht wirklich so machen.
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Freitag 8. Mai 2015, 14:54
von Hyperion
Wo liegt denn jetzt das Problem genau? Beim dynamischen Setzen der Daten in die Query oder beim Parsen der Daten? Ganz woanders?
Ersteres ist doch in der
Doku zur DB-API 2 Schnittstelle gut erklärt (auch wenn es bei ``pymysql`` eine andere Platzhaltersyntax geben könnte - das sollte sich aber leicht in der dortigen Doku finden lassen).
Zweiteres kann man eigentlich recht gut in einer Python-Shell interkativ ausprobieren.
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Montag 11. Mai 2015, 08:18
von trbo
Das Problem besteht darin, dass ich zwei einzelne Programme habe die tun was sie tun sollen, ich diese aber nicht zu einem ''zusammengebaut'' bekomme
Das erste Programm liest mit meine Informationen aus der Textdatei aus und sieht wie folgt aus:
Code: Alles auswählen
Journal=open('J_15April.txt')
jrn=Journal.read()
Zeile=jrn.split('14.04.2015')
x = len (Zeile)
for line in Zeile:
if 'BOTTLE_ID' in line:
line2 = line.split(';')
line3 = line2[0].strip(' BOTTLE_UNIQUE: BOTTLE_ID: 0')
print (line3[:-4])
if 'EAN' not in line:
print ('keine EAN Vorhanden/Fehler')
else:
print(line2[7].strip('EAN: '))
if ' SMR: 1;' in line:
print ('gelesen')
else:
print ('nicht gelesen')
Ausgabe sieht dann hier so aus (sehr viele von diesen
''3er Blöcken''):
18:33:19
42142379
gelesen
18:33:44
42142300
gelesen
18:33:46
42143833
gelesen
Das zweite Programm schreib die Daten in die Datenbank (Wobei ich bei dieser Version noch ''manuell von Hand'' eintragen muss):
Code: Alles auswählen
#!/usr/bin/env python
from __future__ import print_function
import pymysql.cursors
conn = pymysql.connect(host='localhost', port=3306, user='root',passwd='',db='daten', cursorclass=pymysql.cursors.DictCursor)
cur = conn.cursor()
cur.execute("INSERT INTO lga (ean, smr, uhrzeit) VALUES ('85479630','gelesen','17:40:34')")
row = cur.fetchall()
cur.close()
conn.commit()
conn.close()
Mein Problem besteht nun darin, dass ich aus den zwei Codes einen benötige der sämtliche aus dem ersten Programm ausgelesenen Werte automatisch in die DB einträgt nur bekomme ich es leider nicht zum laufen. Die Dokumentation schaue ich mir an momentan nur finde ich es schwierig daraus eine Lösung für mein Problem abzuleiten zwecks mangelnder Erfahrung.
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Montag 11. Mai 2015, 08:31
von Sirius3
@trbo: anscheinend zeigst Du wenig Interesse daran, dass man Dir hilft. In diesem Thread wurden schon etliche Hinweise gegeben, was Deinen Code im allgemeinen, als auch Fehler im speziellen betrifft, die Du alle bisher ignoriert hast. Im anderen Thread wurde Dir schon empfohlen, dass Du Dein Problem in Teilprobleme aufteilst, die Du am besten als Funktionen implementierst. Dabei reicht auch schon ein Gerüst ohne tatsächliche Funktionalität, wo Du dann konkret fragen kannst, wie man dies oder jenes am besten implementiert. Im jetzigen Zustand kann Dir niemand helfen, ohne dass derjenige das gesamte Programm für Dich schreibt. Ich bezweifle, dass das jemand will.
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Montag 11. Mai 2015, 08:32
von Hyperion
trbo hat geschrieben:
Mein Problem besteht nun darin, dass ich aus den zwei Codes einen benötige der sämtliche aus dem ersten Programm ausgelesenen Werte automatisch in die DB einträgt nur bekomme ich es leider nicht zum laufen. Die Dokumentation schaue ich mir an momentan nur finde ich es schwierig daraus eine Lösung für mein Problem abzuleiten zwecks mangelnder Erfahrung.
Schreib Dir doch mal auf Papeir auf, *wie* Du vorgehen würdest. Also vergiss erst einmal Python und schreib Dir nur auf, welche Schritte Du machen musst, um Dein Ziel zu erreichen. Mit dieser Blaupause kannst Du Dich dann daran machen, das ganze in Python zu "formulieren".
Im Grunde genommen hast Du schon alle Zutaten (und Hinweise darüber hinaus) beisammen.
Das hat eigentlich auch nichts mit Erfahrung zu tun, sondern nur mit fundamentalen Dingen, wie dem Verständnis von Schleifen.
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Montag 11. Mai 2015, 10:09
von trbo
Mein Problem ist nur das ich vor einer Woche Python zum ersten mal geöffnet habe und ich nicht weis wo ich anfangen soll. Ich bin ja froh das die einzelnen Sachen so geklappt haben aber von z.B. Funktionen habe ich leider überhaupt keine Ahnung...
Und mit den gegebenen Hinweisen kann ich auch nicht besonders viel anfangen weil ich einfach nicht verstehe was damit teilweise gemeint ist...
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Montag 11. Mai 2015, 10:44
von /me
trbo hat geschrieben:Mein Problem ist nur das ich vor einer Woche Python zum ersten mal geöffnet habe und ich nicht weis wo ich anfangen soll.
Wenn du lernen willst, dann könntest du beispielsweise das
Tutorial durcharbeiten.
Wenn du einfach nur fertigen Code haben willst, dann schreib ein Jobangebot.
Re: Große Datenmenge in mysqldb schreiben - prbleme
Verfasst: Montag 11. Mai 2015, 10:49
von Hyperion
Dann *lerne* die Grundlagen. Funktionen gehören dazu - Du *nutzt* ja bereits welche (ohne Funktionen aufzurufen, kann man quasi *kein* nicht triviales Programm schreiben)!
Du musst doch nur die Datenbankaufrufe *innerhalb* der ``for``-Schleife machen und die bisher statischen Parameter dynamisch an die Query übergeben. Mal als Pseudo-Code:
Code: Alles auswählen
# Datenbank öffnen (``with``)
# Datei öffnen (``with``)
for row in file:
# daten aus row parsen
cursor.execute(query_template, daten)
Was ist daran denn so schwierig? Auf dieses Vorgehen hättest Du doch nun wirklich selber kommen können...
Und die Fragmente hast Du ja bereits alle... :K
Generell ist bei Dir das Problem, dass Du Dich vermutlich zu früh mit zu komplexen Problemen befasst. Ohne die Grundlagen systematisch zu lernen, wirst Du damit nicht weiterkommen - wie Du ja gerade siehst...