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

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
mburghart
User
Beiträge: 6
Registriert: Mittwoch 12. Oktober 2011, 13:59

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
Zuletzt geändert von mburghart am Mittwoch 14. Dezember 2011, 12:24, insgesamt 1-mal geändert.
deets

Die Meldung ist nunmal eindeutig - die Daten muessen falsch sein. Gib sie doch mal mit pprint.pprint direkt vor dem Statement aus.
mburghart
User
Beiträge: 6
Registriert: Mittwoch 12. Oktober 2011, 13:59

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
mburghart
User
Beiträge: 6
Registriert: Mittwoch 12. Oktober 2011, 13:59

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

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
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@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.
In specifications, Murphy's Law supersedes Ohm's.
mburghart
User
Beiträge: 6
Registriert: Mittwoch 12. Oktober 2011, 13:59

Hey super,

danke für die Hilfe. Kannte ich bis jetzt noch nicht.
Passt super. Danke.
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!
Johnson
User
Beiträge: 6
Registriert: Donnerstag 7. Juni 2012, 16:09

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

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 ...
Antworten