noch ein Zaehlerproblem

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
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Code: Alles auswählen

inp = open('sum_of_all_LLS')
header = inp.readline()
for line in inp:
    data = line.split()
    data[4] = int(data[4])
    val =0
    if data[4] > 1:
        val +=1

    print val
Ich moechte gern in der 5.Spalte meiner eingelesenen Datei alle die Werte zaehlen, die groesser "1" sind.
Es funktioniert jedoch nicht und ich weiss nicht woran es liegt.
Als Fehlermeldung kommt zum Beispiel
Traceback (most recent call last):
File "/home/cellnet/claudiak/bei/18.561.296 random interactions/100 50 1000/count_evidences.py", line 5, in <module>
data[4] = int(data[4])
IndexError: list index out of range
Das verstehe ich nicht, denn ganz offensichtlich enthaelt meine Datei eine Spalte 5
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

silky vanilla hat geschrieben:

Code: Alles auswählen

inp = open('sum_of_all_LLS')
header = inp.readline()
for line in inp:
    data = line.split()
    data[4] = int(data[4])
    val =0
    if data[4] > 1:
        val +=1

    print val
Es funktioniert jedoch nicht und ich weiss nicht woran es liegt.
Hallo silky vanilla!

In solchen Fällen hilft ein ``print line`` und ein ``print data``, an richtiger Stelle, die Welt wieder zu verstehen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
silky vanilla
User
Beiträge: 51
Registriert: Donnerstag 3. Mai 2007, 09:46

Ich verstehe nur die Fehlermeldung nicht, es ist nach wie vor die selbe, auch bei dieser Aenderung

Code: Alles auswählen

inp = open('sum_of_all_LLS')

header = inp.readline()
val =0
for line in inp:
    data = line.split()
    
    if int(data[4]) > 1:
        val += 1
print val
inp.close()
BlackJack

Du hast die Fehlermeldung schon verstanden: Es gibt keine 5. Spalte. In irgendeiner der Zeilen. Kann es zum Beispiel sein, dass die Datei als allerletztes eine bzw. zwei Leerzeilen enthält? Das übersieht man gerne mal.
Zuletzt geändert von BlackJack am Dienstag 17. Juli 2007, 15:45, insgesamt 1-mal geändert.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

silky vanilla hat geschrieben:Ich verstehe nur die Fehlermeldung nicht
Hallo silky vanilla!

Damit wollte ich dich nur in die Kunst des Print-Debuggens einführen. ;-)

Die Fehlermeldung "IndexError: list index out of range" bedeutet, dass du versuchst, auf ein Element einer Liste zuzugreifen, welches es nicht gibt. ``data[4]`` gibt es also nicht. Also ist der Name "data" mit etwas anderem belegt, als du glaubst. Um heraus zu finden, mit was "data" befüllt ist --> ``print "data:", data``.
Um heraus zu bekommen, warum data falsch befüllt wird, musst du raus bekommen, was in der aktuellen Zeile steht: ``print "line:", line``

Code: Alles auswählen

inp = open('sum_of_all_LLS')

header = inp.readline()
val =0
for line in inp:
    print "line:", line
    data = line.split()
    print "data:", data
    if int(data[4]) > 1:
        val += 1
print val
inp.close()
Wahrscheinlich wirst du damit drauf kommen, dass in der von dir geöffneten Textdatei in der aktuellen Zeile nicht das drinnen steht, was du vermutest. Und wenn es nur eine Leerzeile ist...
Wahrscheinlich musst du einfach zusätzlich unterhalb von ``for line in inp:`` mit ``if line:`` prüfen, ob etwas in der Zeile steht.

mfg
Gerold
:-)

PS: Nicht vergessen, die print-Anweisungen wieder aus dem Quellcode entfernen.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten