[Python-de] Fehler im Auslesen von Dateien

Sebastian Wiesner basti.wiesner at gmx.net
Do Nov 1 18:45:32 CET 2007


[ "Christoph Heer" <christoph.heer at googlemail.com> ]
> Liebe Pythonfreunde,
> ich habe schon wieder mal ein porblem. Ich kann mir aber kein Reim drafu
> machen. In meinem Skript [1] soll aus einer TXT Datei daten über Telnet
> an Teamspeak gesendet werden. Leider bekomme ich immer die Fehlermeldung:
>
> Traceback (most recent call last):
>   File "news.py", line 39, in <module>
>     tel.write('msg @' + title[i])
> IndexError: list index out of range

Ja, was erwartest du?

Du berechnest "wiederholungen" als "len(title) + int('2')". Mal abgesehen 
davon, dass int('2') schwachsinnig ist, ist ein IndexError nur die logische 
Konsequenz, wenn du den Wert von "wiederholungen" als Basis für die 
Iteration über "title" nimmst. Ein Beispiel:

[lunar at nargond]-[18:22:28] >> /home/lunar
[1]--> title = ['foo\n', 'bar\n']

[lunar at nargond]-[18:22:31] >> /home/lunar
[2]--> len title
-----> len(title)
Out[2]: 2

[lunar at nargond]-[18:22:35] >> /home/lunar
[3]--> wiederholungen = len(title) + 2

[lunar at nargond]-[18:22:42] >> /home/lunar
[4]--> wiederholungen
Out[4]: 4

[lunar at nargond]-[18:22:44] >> /home/lunar
[5]--> for i in range(1, wiederholungen):
   ...:     print i, ('Index existiert' if i < len(title) else 'Index 
existiert nicht')
   ...:
1 Index existiert
2 Index existiert nicht
3 Index existiert nicht

Das ist nur logisch, wenn man versucht, über 2 Element mehr zu iterieren, 
als eigentlich in der Liste enthalten sind.  Man kann ja auch nicht 4 Äpfel 
aus einem Korb nehmen, in dem nur 2 drin sind, oder?

Btw, dein Code ist - nett gesagt - suboptimal. int("2") habe ich bereits 
angesprochen. Erwähnenswert wäre noch, dass man range _nie_ zum Iterieren 
nimmt.  Wenn man Elemente einer Liste erhalten will, itiert man direkt über 
die Liste, benötigt man den Zähler zusätzlich, so gibt es enumerate. Wenn 
man schon unbedingt die hässliche Variante mit Index nehmen will, dann doch 
bitte per xrange, was wenigstens das Anlegen der Liste erspart. Auch würde 
ich rf.readlines weglassen und stattdessen ebenfalls direkt über das 
Dateiobjekt iterieren, was eine weitere Listen-Erzeugung einsparen würde. 

Sollte das selbe tun, allerdings ungetestet: 
http://paste.pocoo.org/show/8561/

-- 
Freiheit ist immer die Freiheit der Andersdenkenden.
                                            (Rosa Luxemburg)
-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : signature.asc
Dateityp    : application/pgp-signature
Dateigröße  : 189 bytes
Beschreibung: This is a digitally signed message part.
URL         : <http://mail.python.org/pipermail/python-de/attachments/20071101/aa90652e/attachment.pgp>


Mehr Informationen über die Mailingliste python-de