[Python-de] Fehler im Auslesen von Dateien

Sebastian Wiesner basti.wiesner at gmx.net
Do Nov 1 17:45:32 UTC 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   : nicht verf├╝gbar
Dateityp    : application/pgp-signature
Dateigr├Â├če  : 189 bytes
Beschreibung: This is a digitally signed message part.
URL         : http://python.net/pipermail/python-de/attachments/20071101/aa90652e/attachment.pgp