Große Datenmenge in mysqldb schreiben - prbleme

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
trbo
User
Beiträge: 10
Registriert: Mittwoch 29. April 2015, 08:48

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

@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.
trbo
User
Beiträge: 10
Registriert: Mittwoch 29. April 2015, 08:48

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

@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.
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bei vielen Datensätzen sollte man noch ``executemany`` des DB2-APIs erwähnen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
trbo
User
Beiträge: 10
Registriert: Mittwoch 29. April 2015, 08:48

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
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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
trbo
User
Beiträge: 10
Registriert: Mittwoch 29. April 2015, 08:48

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

@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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
trbo
User
Beiträge: 10
Registriert: Mittwoch 29. April 2015, 08:48

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...
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten