我为什么会在这个程序中遇到索引错误?

0 投票
2 回答
46 浏览
提问于 2025-04-14 17:23

我正在尝试写一段代码,目的是把第一行的数字减去第二行的数字。每次运行这个程序时,我都会遇到一个错误,提示是IndexError: list index out of range。我在文本文件中调用了第0行和第1行的数据,但它就是不进行计算。

test = open("test.txt", "r")
num1 = int(test.readlines()[0])
num2 = int(test.readlines()[1])
print(num1 - num2)

这是测试文件中的数值。我本来希望它能输出250。

500
250

我希望这段代码能进行计算,输出计算的结果。

2 个回答

1

调用 readlines 一次会把文件里的所有行都放到一个列表里返回。再调用一次就会返回一个空列表,因为第一次调用的时候已经把所有行都读完了。下面的代码片段会让这个更清楚:

test = open("data.txt", "r")
print(test.readlines())
print(test.readlines())

输出:

['500\n', '250\n']
[]

在你的脚本中,第3行调用 readlines 时返回的是 []。这个空列表在索引1的位置没有任何东西,所以就出现了索引错误。

你可以这样重写代码,让它正常工作:

test = open("data.txt", "r")
lines = test.readlines()
num1 = int(lines[0])
num2 = int(lines[1])
print(num1 - num2)

如果你使用 with 来处理文件,这样在完成后会自动关闭文件,效果会更好。

with open("data.txt", "r") as test:
    lines = test.readlines()
    num1 = int(lines[0])
    num2 = int(lines[1])
    print(num1 - num2)
3

第一次调用 readlines 方法时,会把文件里的所有行都读出来,并把文件指针放在文件的最后面。这样第二次调用的时候,就没有内容可以读取了,所以返回的是一个空列表。

你可以选择一次性读取整个文件,然后用这个列表来定义 num1num2

with open("test.txt") as f:
    lines = f.readlines()

num1 = int(lines[0])
num2 = int(lines[1])

或者你也可以选择每次读取一行,使用 readline(没有"s")这个方法。

with open("test.txt") as f:
    num1 = int(f.readline())
    num2 = int(f.readline())
 

撰写回答