Und wieder eins: Newsletter Prog

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.
Glamdring
User
Beiträge: 104
Registriert: Sonntag 25. Mai 2003, 20:22
Wohnort: Freiburg i.B.
Kontaktdaten:

Und wieder eins: Newsletter Prog

Beitragvon Glamdring » Dienstag 27. Mai 2003, 14:50

Hi,
ich wollte Adressen aus einem .doc Dokument auslesen und in einer MySQl Datenbank speichern.
Später dann auf die E-mail Adressen zugreifen und den Newsletter senden.
Dieser Code ist die Basis zum einschreiben in die Datenbank, er funzt aber nicht:

Code: Alles auswählen

from MySQLdb import *
from tkFileDialog import *
import string

# Die Datenbank und die Tabelle heissen adressen
def readin():
    print "Geben sie den Pfad an :"
    Dat = askopenfilename()
    dat = file(Dat, "a+")
    for x in range(len(dat.readlines())):
        x = dat.readline()
        y = string.split(x, "///")
        conn = connect(db="adressen")
        cursor = conn.cursor()
        cursor.execute("select * from adressen")
        erg = cursor.fetchall()
        cursor.execute("insert into adressen values (%s, %s, %s, %s)"  %(y[-4], y[-3],y[-2], y[-1]))
        erg = cursor.fetchall()
        print erg
       

readin()

die Fehlermeldung lautet:
list index out of range


Danke im Voraus
Glamdring
Dies ist ein Platzhalter, er steht am Ende jeder meiner Beiträge! Erst wenn ich einen vernünftigen Text gefunden habe wird sich das ändern!
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 27. Mai 2003, 17:00

Hi Glamdring,

Code: Alles auswählen

    for x in range(len(dat.readlines())):
        x = dat.readline()


keine gute Idee, erst x als Schleifenzähler zu verwenden und dann x neu mit einem String zu überschreiben.


Gruß

Dookie
Glamdring
User
Beiträge: 104
Registriert: Sonntag 25. Mai 2003, 20:22
Wohnort: Freiburg i.B.
Kontaktdaten:

Beitragvon Glamdring » Dienstag 27. Mai 2003, 18:03

OK ich habs geändert aber Fehler bleibt bestehen?????

Glamdring
Dies ist ein Platzhalter, er steht am Ende jeder meiner Beiträge! Erst wenn ich einen vernünftigen Text gefunden habe wird sich das ändern!
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Beitragvon Voges » Dienstag 27. Mai 2003, 18:22

Glamdring hat geschrieben:OK ich habs geändert
Und wie?
Ansonsten, debugge Deinen Code einfach mal. Füge mal Zeilen wie print x und print y ein. Sicherlich ist y immer noch eine leere Liste.
Jan
Benutzeravatar
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Beitragvon hans » Dienstag 27. Mai 2003, 18:25

gibt doch bestimmt noch einen Hinweis auf die Zeilennummer, oder?

Hans
Glamdring
User
Beiträge: 104
Registriert: Sonntag 25. Mai 2003, 20:22
Wohnort: Freiburg i.B.
Kontaktdaten:

Beitragvon Glamdring » Dienstag 27. Mai 2003, 18:46

1. @ Voges ja die Liste ist noch leer, der neue Code lautet

Code: Alles auswählen

from MySQLdb import *
from tkFileDialog import *
import string

# Die Datenbank und die Tabelle heissen adressen
def readin():
    print "Geben sie den Pfad an :"
    Dat = askopenfilename()
    dat = file(Dat, "a+")
    for x in range(len(dat.readlines())):
        w = dat.readline()
        y = string.split(w, "///")
        print y
     
        conn = connect(db="adressen")
        cursor = conn.cursor()
        print x
        cursor.execute("select * from adressen")
        erg = cursor.fetchall()
        cursor.execute("insert into adressen values (%s, %s, %s, %s)"  %(y[-4], y[-3],y[-2], y[-1]))
        erg = cursor.fetchall()
        print erg


2. @Hans Ja der Fehler tritt in Zeile 1 auf, obwohl der Fehler den er Angibt sich auf cursor.execute("insert into adressen values (%s, %s, %s, %s)" %(y[-4], y[-3],y[-2], y[-1])) bezieht und das liegt offensichtlich nicht in Zeile eins

Und nochwas, falls wichtig:
OS = Windows XP Home
Python = Python 2.2
Dies ist ein Platzhalter, er steht am Ende jeder meiner Beiträge! Erst wenn ich einen vernünftigen Text gefunden habe wird sich das ändern!
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Beitragvon Voges » Dienstag 27. Mai 2003, 18:58

Glamdring hat geschrieben:2. @Hans Ja der Fehler tritt in Zeile 1 auf,

Kannst Du die Fehlermeldung mal posten? In der Fehlermeldung steht garantiert nichts von Zeile 1, sondern die Zeilennummer der Zeile mit dem "insert into". Und wenn Du nun w etwas zuweist, wäre natürlich print w interessant gewesen ;-). Aber egal.
Den Bock machst Du hier:

Code: Alles auswählen

    for x in range(len(dat.readlines())):
        w = dat.readline()
Mit readlines() liest Du auf einen Schlag alle Zeilen weg, und das nur, um die Zahl der Zeilen zu ermitteln. Somit bleibt für das readline() in w = dat.readline() nichts mehr übrig. Richtig wäre sowas wie:

Code: Alles auswählen

    for w in dat.readlines():
        y = w.split("///")

Jan
Benutzeravatar
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Beitragvon hans » Dienstag 27. Mai 2003, 19:42

Dann poste bitte auch gleich die ersten paar Zeilen aus der Datei, welche du einlesen willst.

Ich habe das Gefühl, da nicht genug Felder in einem Record (eine Zeile) sind, und deshalb y zuwenig Elemente hat.

Wer lesen kann, der brauch nicht nachbessern. Voges hat die Ursache schon genannt. (Versuch hinter dem Dateiende zu lesen)

Hans
Glamdring
User
Beiträge: 104
Registriert: Sonntag 25. Mai 2003, 20:22
Wohnort: Freiburg i.B.
Kontaktdaten:

Beitragvon Glamdring » Dienstag 27. Mai 2003, 21:17

Ich habe alles gemäß dem Vorschlag von Voges geändert, er findet y und w, sie haben den richtigen Inhalt,aber jetzt gibts einen neuen Fehler, liegt es daran, das er das @ nicht mag?

Fehler:

Traceback (most recent call last):
File "C:\Python22\Datenbank.py", line 23, in ?
readin()
File "C:\Python22\Datenbank.py", line 18, in readin
cursor.execute("insert into adressen values (%s, %s, %s, %s)" %(y[-4], y[-3],y[-2], y[-1]))
File "C:\Python22\Lib\site-packages\MySQLdb\cursors.py", line 61, in execute
r = self._query(query)
File "C:\Python22\Lib\site-packages\MySQLdb\cursors.py", line 168, in _query
rowcount = self._BaseCursor__do_query(q)
File "C:\Python22\Lib\site-packages\MySQLdb\cursors.py", line 112, in __do_query
db.query(q)
ProgrammingError: (1064, "You have an error in your SQL syntax near '@mail.de\n)' at line 1")


Das Dokument, das ich zum testen verwendete(das andere existiert noch nicht) hat folgenden Inhalt:
2///Test///Testadresse///Testmail@mail.de


Falls die Datenbank interessant ist:
MySQl Datenbank
Tabelle mit Werten
ID Integerzahl die nicht null ist,
Name bis zu 255 Zeichen beliebiger text,
Adresse, siehe oben,
E-mail, siehe auch oben

Und nocheinmal, der aktuelle Code.

Code: Alles auswählen


from MySQLdb import *
from tkFileDialog import *
from string import *

# Die Datenbank und die Tabelle heissen adressen
def readin():
    print "Geben sie den Pfad an :"
    Dat = askopenfilename()
    dat = file(Dat, "a+")
    for w in dat.readlines():
        y = w.split( "///")
        print y
        print w
        conn = connect(db="adressen")
        cursor = conn.cursor()
        cursor.execute("select * from adressen")
        erg = cursor.fetchall()
        cursor.execute("insert into adressen values (%s, %s, %s, %s)"  %(y[-4], y[-3],y[-2], y[-1]))
        erg = cursor.fetchall()
        print erg
       

readin()





So mehr das wars,
Hoffentlich könnt ihr was damit anfangen, danke für eure Mühe
Glamdring
Dies ist ein Platzhalter, er steht am Ende jeder meiner Beiträge! Erst wenn ich einen vernünftigen Text gefunden habe wird sich das ändern!
Benutzeravatar
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Beitragvon hans » Dienstag 27. Mai 2003, 21:40

Tipp: gib

Code: Alles auswählen

"insert into adressen values (%s, %s, %s, %s)"  %(y[-4], y[-3],y[-2], y[-1])
einmal in eine Variable aus und lass sie dir anzeigen. Die Syntax deines SQL_Scripts stimmt nicht. Das ist jetz kein Python Fehler mehr.

Hans
Benutzeravatar
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Beitragvon hans » Dienstag 27. Mai 2003, 21:49

Prüf doch mal, ob in deinem SQL - Script die Texte auch durch Anführunszeichen abgegrenzt werden. Ich würd sagen, die fehlen. Ich halte es bei SQL-Scripten grundsätzlich so, dass ich sie zumindest temporär Zwischenspeichere. Dass erleichtert die Fehlersuche.

Hans
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Dienstag 27. Mai 2003, 22:14

Hi,

Code: Alles auswählen

"insert into adressen values (`%s`, `%s`, `%s`, `%s`)"  %(y[-4], y[-3],y[-2], y[-1])


sollte das Problem beheben


Dookie
Benutzeravatar
python
User
Beiträge: 15
Registriert: Dienstag 14. Januar 2003, 07:20

Beitragvon python » Mittwoch 28. Mai 2003, 09:56

du hast beim insert die spaltennamen nicht angegeben:

Code: Alles auswählen

"insert into adressen (spalte1, spalte2, spalte3, spalte4) values (`%s`, `%s`, `%s`, `%s`)"  %(y[-4], y[-3],y[-2], y[-1])
python

Bild
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Beitragvon Voges » Mittwoch 28. Mai 2003, 10:42

python hat geschrieben:du hast beim insert die spaltennamen nicht angegeben:
Was auch nicht nötig ist, wenn Anzahl und Reihenfolge der einzufügenden Werte den Spalten der Tabelle entsprechen.
Jan
Benutzeravatar
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Beitragvon Dookie » Mittwoch 28. Mai 2003, 12:09

mir ist da noch einiges aufgefallen,

Code: Alles auswählen

from MySQLdb import *
from tkFileDialog import *
#from string import  * # wird nicht mehr benoetigt

# Die Datenbank und die Tabelle heissen adressen
def readin():
    print "Geben sie den Pfad an :"
    Dat = askopenfilename()
    dat = file(Dat, "a+")
    conn = connect(db="adressen")
    cursor = conn.cursor()
    for w in dat.readlines():
        y = w.split( "///")
        print y
        print w
        # conn = connect(db="adressen") # warum in der Schleife?
        # cursor = conn.cursor()
        # cursor.execute("select * from adressen") # auch sinnlos hier oder?
        # erg = cursor.fetchall()
        cursor.execute("insert into adressen values (`%s`, `%s`, `%s`, `%s`)"  %(y[-4], y[-3],y[-2], y[-1]))
        erg = cursor.fetchall() # wird wohl nicht viel fetchen ;)
        print erg

readin()


in einer Schleife immer nur das machen, was auch in der Schleife nötig ist!


Gruß

Dookie

Wer ist online?

Mitglieder in diesem Forum: r.barrios