2017-06-22 4 views
0

Ich bin neu bei Python und mache einige elementare Codierungsaufgaben auf edx mit dem Jupityr-Notebook. Ich habe bei einer meiner Aufgaben einen Indexfehler festgestellt, den ich nicht genau herausfinden kann. Die Zuweisung hat mir eine Textdatei Zeile für Zeile innerhalb einer while-Schleife gelesen und die Ausgabe in einem bestimmten Format ausgegeben. Mein Code ist wieIndexfehler beim Lesen der TXT-Datei

city_temp = mean_temp.readline().strip().split(',') 

while city_temp: 

    print (headings[0].title(), "of", city_temp[0], headings[2], "is", city_temp[2], "Celsius") 
    city_temp = mean_temp.readline().strip().split(',') 

folgt Der Code läuft durch die gesamte Datei, sondern die Beendigung der ‚while‘ Schleife in der leeren Zeile, geht es weiter zu laufen und eine leere Liste zu erstellen. Ich bin mir nicht sicher, warum das passiert und ich kann mir selbst keine Lösung vorstellen. Ich habe versucht, einen 'if' Test für eine leere Zeichenfolge und brechen, und auch eine zusätzliche Zeile mit leerem Text zu schreiben, aber keine der beiden Optionen führte zu einem Erfolg. Wenn jemand eine Idee hat, würde ich es sehr schätzen!

Ich habe einen Auszug von dem, was die TXT-Datei enthält auch unten eingefügt. Es gibt weitere Städte, aber ich finde es nicht notwendig, alle umfassen ein:

city,country,month ave: highest high,month ave: lowest low 
Beijing,China,30.9,-8.4 

Dies ist der Index Fehler war ich immer: (sorry für die schlechte Formatierung, das Lernen noch


IndexError        Traceback (most recent call last) 
<ipython-input-18-6ea7e8e263b5> in <module>() 
     5 while city_temp: 
     6 
----> 7  print (headings[0].title(), "of", city_temp[0], headings[2], "is", city_temp[2], "Celsius") 
     8  city_temp = mean_temp.readline().strip().split(',') 
     9 

IndexError: list index out of range 
+0

Um Ihren IndexError tatsächlich zu lösen, bearbeiten Sie in Ihrer Frage Ihre gesamte Fehlermeldung, einschließlich der Traceback. city_temp sollte eine leere Liste sein, wenn es eine leere Zeile liest (strip() löscht alle Leerzeichen, bevor die Trennung erfolgt), also gibt es hier noch etwas anderes. –

+0

@AlanLeuthard Ich habe den gesamten Fehler beigefügt, den ich bekommen habe, ich bin sehr neugierig zu verstehen, warum dieser Fehler passiert – thatbrownkid

+0

Ahhhh ... nur getestet. 'empty_string.split()' gibt eine leere Liste zurück. 'empty_string.split (', ')' gibt eine Liste mit einem leeren String zurück. Die Liste ist nicht leer, daher ist city_temp True. Ändern Sie 'while city_temp' in 'while city_temp [0]', um die Leere der Liste zu überprüfen. Oder verwende einen try-Block. –

Antwort

0

Ein besserer (pythonic?) Weg, um dies zu erreichen, w ould be:

Sie können eine Datei zeilenweise lesen, indem Sie das Dateiobjekt als Iterator verwenden. Dieser sollte den try-Block nicht benötigen, da die Schleife ordnungsgemäß endet, wenn sie eine leere Zeile erreicht. Fügen Sie diesen Code auch in eine With-Anweisung ein:

, um sicherzustellen, dass die Datei geschlossen wird, wenn Sie mit dem Lesen fertig sind.

Check out: https://docs.python.org/3/tutorial/inputoutput.html

Um zu klären, was tatsächlich in der Frage vor sich geht:

Wenn Readline-(), um das Ende einer Datei erreicht hat, gibt es eine leere Zeichenfolge. Wenn Sie strip() für eine leere Zeichenfolge verwenden, wird eine leere Liste zurückgegeben. Wenn Sie strip (',') oder ein beliebiges Trennzeichen für eine leere Zeichenfolge verwenden, wird eine Liste mit einer leeren Zeichenfolge zurückgegeben. In diesem Fall hat Ihre while-Schleife die Liste überprüft. Da die Liste nicht leer war, gab sie True zurück und die while-Schleife wurde fortgesetzt. Wenn Sie die while-Schleife benötigen, würde meine Empfehlung:

line = mean_temp.readline() 
while line: 
    city_temp = line.strip().split(',') 
    print ("{} of {} {} is {} Celsius".format(headings[0].title(), 
               city_temp[0], 
               headings[2], 
               city_temp[2])) 
    line = mean_temp.readline() 

Dies ist wahrscheinlich die sauberste Weg Schleife Ihren Weg durch eine Datei Zeile für Zeile Zeit. Ziemlich genau das Gleiche wie die for-Schleife oben.

+0

Das ist eine tolle Idee, danke für den Tipp! Leider erfordert die Eingabe, die ich mache, dass die while-Schleife vorhanden ist, aber ich werde definitiv in Zukunft den Befehl try verwenden. – thatbrownkid

+0

Dann behalte die readline() - Anfangsbedingung und while-Schleife. Verwenden Sie den try: block für Ihre print-Anweisung und Sie sind fertig. –

+0

fantastisch! Vielen Dank für Ihre Hilfe! – thatbrownkid

0

ich glaube, Sie für leere Liste überprüfen müssen und nicht leere Zeichenfolge

city_temp = mean_temp.readline().strip().split(',') 

while city_temp: 

    print (headings[0].title(), "of", city_temp[0], headings[2], "is", city_temp[2], "Celsius") 
    city_temp = mean_temp.readline().strip().split(',') 
    if len(city_temp) == 0: 
    break 
+0

Ich habe versucht, dies zu tun, und ich habe immer noch den Indexfehler. Indexerror Traceback (jüngste Aufforderung zuletzt) ​​ in () ich mit Ihrem Kommentar nicht einverstanden, dass ich sollte jedoch für eine leere Liste werden überprüft, weiß ich nicht, warum habe ich nicht daran gedacht. – thatbrownkid

+1

Sie suchen nach einer leeren Liste. Wenn "city_temp" leer ist, wird es der while-Schleife als False übergeben. Die Überprüfung auf 0 Länge ist eigentlich überflüssig. –