индекс списка вне диапазона (с циклом while) - PullRequest
0 голосов
/ 11 февраля 2019

Я работаю над заданием для курса edx, и у меня возникает ошибка "index out of range" в моем коде, когда он запускает цикл while, хотя в конечном итоге он дает правильный вывод.

Это мой код:

# [] create The Weather
# [] copy and paste in edX assignment page
!curl https://raw.githubusercontent.com/MicrosoftLearning/intropython/master/world_temp_mean.csv -o mean_temp.txt

mean_temp = open('mean_temp.txt', 'a+')
mean_temp.write("Rio de Janeiro,Brazil,30.0,18.0\n")

mean_temp.seek(0)

headings = mean_temp.readline().split(',')

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

mean_temp.close()

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Когда вы нажимаете пустую последнюю строку, то есть '', результат mean_temp.readline().split(',') равен [''], а не [], следовательно, ваш цикл продолжается, и вы получаете ошибку индекса.Вместо этого вы можете проверить len:

while len(city_temp) == 4:
    print(headings[0].capitalize(), "of", city_temp[0], headings[2], "is", city_temp[2], "Celsius")
    city_temp = mean_temp.readline().split(',')

Однако лучший способ справиться с этим - использовать правильный цикл for и считыватель csv:

import csv
with open('mean_temp.txt') as f:
    reader = csv.reader(f)
    header = next(reader)
    for city in reader:
        print(header[0].capitalize(), "of", city[0], header[2], "is", city[2], "Celsius")

(Формат файла будет работать даже лучше с DictReader, но способ печати этой строки - нет.)

0 голосов
/ 11 февраля 2019

Я проверил это, и оно должно работать.Я думаю, что ваше предложение while неправильно находит конец файла - цикл for работает и чище.

with open("mean_temp.txt", "a") as f:
    f.write("\nRio de Janeiro,Brazil,30.0,18.0")

with open("mean_temp.txt", "r") as f:
    headings = f.readline().split(',')
    for next_line in f:
        next_line = next_line.split(',')
        print(headings[0].capitalize(), "of", next_line[0], headings[2], "is", next_line[2], "Celsius")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...