读取txt文件时索引错误

时间:2017-06-22 15:25:17

标签: python indexoutofboundsexception readline

我是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

2 个答案:

答案 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循环完全相同。