Seite 1 von 1

Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Mittwoch 14. Dezember 2011, 12:22
von mburghart
Hallo Forumsmitglieder,

ich schreibe an einem Auswertetool für mein GPS-Gerät. Dazu lese ich alle Daten von einer CSV-Datei ein, speichere sie in einem array und möchte sie anschließend in SQLite3 übertragen.

Datenverbindung zu SQLite funktioniert. Tabelle ist vorhanden und Tabellenstruktur stimmt. Nur beim Insert-Befehl wirft er mir immer einen Fehler und ich verstehe es nicht. Ich lasse mir extra vorher noch die Länge des Arrays ausgeben, damit ich sehe ob diese stimmt. Und trotzdem wirft Python mir immer wieder die Meldung:

Code: Alles auswählen

  
File "C_SQLite.py", line 45, in csv2sql
    clearedset[j][9],\
IndexError: list index out of range
Ich verstehe es nicht. Kann mir jemand helfen?

Hier der ganze INSERT, die Länge des Arrays ist definitiv 11:

Code: Alles auswählen

tkMessageBox.showinfo("", str(len(clearedset[0])))
        
for j in range (len(clearedset)):
   self.cursor.execute('INSERT INTO "t_csvlogs" (id, ord, car, lat, lon, elev, diststart, distlast, bearing, speed, date, time) VALUES (null,?,?,?,?,?,?,?,?,?,?,?)',  \
                                        (   clearedset[j][0],  \
                                            clearedset[j][1],  \
                                            clearedset[j][2],  \
                                            clearedset[j][3],  \
                                            clearedset[j][4],  \
                                            clearedset[j][5],  \
                                            clearedset[j][6],  \
                                            clearedset[j][7],  \
                                            clearedset[j][8],  \
                                            clearedset[j][9],\
                                            clearedset[j][10]))
                                            
self.connection.commit()
Wenn ich beim Insert-Befehl das Array nur bis 8 auslese und die letzten 3 Werte immer mit dem Wert "clearedset[j][8]" befülle - funktioniert es. Aber das sind halt die falschen Werte

Re: Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Mittwoch 14. Dezember 2011, 12:24
von deets
Die Meldung ist nunmal eindeutig - die Daten muessen falsch sein. Gib sie doch mal mit pprint.pprint direkt vor dem Statement aus.

Re: Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Mittwoch 14. Dezember 2011, 12:31
von mburghart
hab ich gemacht:

Hier nur mal die letzten zwei DS von über 6000:

Code: Alles auswählen

765.0
'REG_FH501'
48.7390048
13.7164
670.0
59.92
0.064
344.0
45.8
20110210
185814
766.0
'REG_FH501'
48.7389504
13.7174752
667.0
59.999
0.079
274.0
56.9
20110210
185819
767.0
'REG_FH501'
48.7387968
13.7188128
660.0
60.098
0.099
280.0
71.64
20110210
185824

Re: Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Mittwoch 14. Dezember 2011, 12:44
von mburghart
Warum finde ich meine Fehler immer selbst?
Erst suche ich ewig und komme auf keinen grünen Zweig und nachdem ich meine Frage ins Forum gestellt habe, finde ich den Fehler selbst.

Fehler war:
(len(clearedset)) gibt natürlich die tatsächliche Anzahl an Datensätzen zurück. Allerdings mit Basis 1.

Also muss es in meiner Schleife heißen:

Code: Alles auswählen

for j in range (len(clearedset)-1):
   pass
trotzdem danke für die Hilfe :-)

Re: Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Mittwoch 14. Dezember 2011, 13:18
von /me
mburghart hat geschrieben:

Code: Alles auswählen

for j in range (len(clearedset)-1):
   pass
Gewöhn dir das mit dem range wieder ab wenn du eigentlich nur die einzelnen Elemente haben willst. Statt

Code: Alles auswählen

for i in len(data):
    print data[i]
kannst du einfach Folgendes verwenden:

Code: Alles auswählen

for value in data:
    print value

Re: Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Mittwoch 14. Dezember 2011, 13:21
von pillmuncher
@mburghart: Warum nimmst du nicht executemany()?

Code: Alles auswählen

self.cursor.executemany('INSERT INTO "t_csvlogs" (id, ord, car, lat, lon, elev, diststart, distlast, bearing, speed, date, time) VALUES (null,?,?,?,?,?,?,?,?,?,?,?)',  clearedset)
Hab's nach der Doku gebaut, aber nicht getestet.

Re: Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Donnerstag 15. Dezember 2011, 08:06
von mburghart
Hey super,

danke für die Hilfe. Kannte ich bis jetzt noch nicht.
Passt super. Danke.

Re: Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Donnerstag 15. Dezember 2011, 08:52
von BlackJack
@mburghart: Noch mal zum Fehler den Du meintest gefunden zu haben: `len()` gibt zwar die Länge zurück und ist damit quasi um 1 verschoben zum letzten Index, *aaaber* die Zahlen bei ``range(n)`` gehen von 0 bis n - 1. Wenn Du also *zusätzlich* 1 davon abziehst, dann verarbeitest Du das letzte Element von `clearedset` nicht!

Re: Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Donnerstag 7. Juni 2012, 16:12
von Johnson
Du findest den Fehler meist selbst, weil du alle Schritte beim Posten nochmal durchgehst. :) Manchmal poste ich auch Fragen, die schon geklärt werden ehe ich den Beitrag abschicke ^^

Re: Bei INSERT-INTO immer 'list-index out of range'

Verfasst: Donnerstag 7. Juni 2012, 16:39
von /me
Johnson hat geschrieben:Du findest den Fehler meist selbst, weil du alle Schritte beim Posten nochmal durchgehst. :) Manchmal poste ich auch Fragen, die schon geklärt werden ehe ich den Beitrag abschicke ^^
Und manchmal gräbst du längst verstorbene Threads im Forum aus ...