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:

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!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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:

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

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
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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:

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

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
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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:

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!
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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
python
User
Beiträge: 15
Registriert: Dienstag 14. Januar 2003, 07:20

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

[url=http://www.python-welt.de/][img]http://www.python-welt.de/bilder/banner/banner_100x20.gif[/img][/url]
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

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
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

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

So, ich hab den Code mal wieder mir eurer Hilfe aktualisiert und es gibt einen neuen Fehler:
Traceback (most recent call last):
File "C:\Python22\Datenbank.py", line 25, in ?
readin()
File "C:\Python22\Datenbank.py", line 22, in readin
cursor.execute(values)
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)
OperationalError: (1054, "Unknown column '2' in 'field list'")

Wenn ich das richtig verstehe(was nicht sein muss) versteht er 2 nicht oder es ist nicht das gewünschte Format ( Integer stat ???)

Aber ich habe das erste Element (welches 2 ist) mit int not null belegt, und so wie ich das sehe (oder sehen kann) ist 2 int not null!

Achja, der neue Code:

Code: Alles auswählen

# 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()
    cursor.execute("select * from adressen")
    erg = cursor.fetchall()
    for w in dat.readlines():
        y = w.split( "///")
        print y
        print w
        values = "insert into adressen values (`%s`, `%s`, `%s`, `%s`)" %(y[-4], y[-3],y[-2], y[-1])
        print values
        #cursor.execute("insert into adressen values(y[-4], y[-3],y[-2], y[-1])")
        #cursor.execute("insert into adressen values (`%s`, `%s`, `%s`, `%s`)")  %(y[-4], y[-3],y[-2], y[-1])
        cursor.execute(values)
        

readin()
Danke
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!
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

is ein sql-Problem, was gibt er denn bei den printstatements aus? Poste am Besten die ganze Ausgabe von Deinem Programm.

Gruß

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

OK, hier die Ausgabe vom ganzen Programm:


Geben sie den Pfad an :
['2', 'Test', 'Testadresse', 'Testmail@mail.de\n']
2///Test///Testadresse///Testmail@mail.de

insert into adressen values (`2`, `Test`, `Testadresse`, `Testmail@mail.de
`)
Traceback (most recent call last):
File "C:\Python22\Datenbank.py", line 25, in ?
readin()
File "C:\Python22\Datenbank.py", line 22, in readin
cursor.execute(values)
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)
OperationalError: (1054, "Unknown column '2' in 'field list'")


Gruss
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

Glamdring hat geschrieben:insert into adressen values (`2`, `Test`, `Testadresse`, `Testmail@mail.de
`)
Ich glaub' zwar nicht, dass das was damit zu tun hat, aber Du hast da am Ende noch einen Zeilenvorschub. Füge mal vor der split()-Zeile noch folgende Zeile ein:
w = w.rstrip()
Jan
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

jetzt wär noch interessant, wie die MySQL-Tabelle aufgebaut ist
Antworten