我是python的新手,并使用Jupityr笔记本在edx上进行一些基本的编码分配。我在我的一个任务中遇到了索引错误,我无法弄明白。分配让我在while循环中一次读取一行文本文件,并以特定格式打印输出。我的代码如下
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(',')
代码遍历整个文件,但不是在空行结束'while'循环,而是继续运行并创建一个空列表。我不确定为什么会发生这种情况,也无法自行解决问题。我已经尝试为空字符串添加'if'测试并打破,并且还编写了另一行空文本,但这两个选项都没有取得任何成功。如果有人有想法我会非常感激!
我还摘录了下面粘贴的txt文件的内容。还有其他城市,但我认为没有必要包括每个城市:
city,country,month ave: highest high,month ave: lowest low
Beijing,China,30.9,-8.4
这是我得到的索引错误:(抱歉格式不佳,仍在学习
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 :(得分:0)
我相信您需要检查空列表而不是空字符串
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
答案 1 :(得分:0)
更好(更pythonic?)的方法是:
for line in mean_temp:
city_temp = line.strip().split(',')
try:
print ("{} of {} {} is {} Celsius".format(headings[0].title(),
city_temp[0],
headings[2],
city_temp[2]))
except IndexError:
break
您可以使用文件对象作为迭代器逐行读取文件。这个不应该需要try块,因为当它到达空行时,循环将正常结束。另外,将此代码放在with语句中:
with open("myfile.txt", 'r') as mean_temp:
确保文件在您阅读完毕后关闭。
退房:https://docs.python.org/3/tutorial/inputoutput.html
澄清问题中实际发生的事情:
当readline()到达文件末尾时,它返回一个空字符串。在空字符串上使用strip()时,它返回一个空列表。当您在空字符串上使用strip(&#39;,&#39;)或任何分隔符时,它会返回一个包含空字符串的列表。在这种情况下,您的while循环正在检查列表。由于列表不是空的,它返回True并且while循环继续。如果你需要while循环,我的推荐是:
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()
这可能是通过文件逐行循环的最简洁方法。几乎与上面的for循环完全相同。