Python 2.7字符串索引错误

时间:2016-01-10 09:20:13

标签: python random

我正在编写程序,使用while循环作为计数器从文本文件中选择随机行,然后使用另一个变量来选择随机行:

import random 


fortunes_file = open("fortunes.txt", "r")


fortunes = fortunes_file.readline()

count = 0


while fortunes != "":
    count += 1
    fortunes = fortunes_file.readline()

rand_line = random.randint(1, count)

print fortunes[rand_line]

fortunes_file.close()

但是,尝试运行程序时出现以下错误:

IndexError: string index out of range

3 个答案:

答案 0 :(得分:2)

您需要readlines()而不是readline();但实际上你可以高度简化你的代码:

import random

with open('fortunes.txt') as f:
   fortunes = list(f)

print(random.choice(fortunes))

或者,如果您更喜欢readlines()版本:

import random

f = open('fortunes.txt')
fortunes = f.readlines()
f.close()

print(random.choice(fortunes))

答案 1 :(得分:1)

您在fortunes循环的每次迭代中覆盖while。  在EOF .readline()返回一个空字符串,因此fortunes[rand_line]会引发IndexError。您可以使用.readlines()代替(或仅使用文件对象作为迭代器):

with open("fortunes.txt", "r") as fortunes_file:
    fortunes = fortunes_file.readlines()  # alternatively, use list(fortunes_file)
print(random.choice(fortunes))

答案 2 :(得分:0)

问题在于:

fortunes = fortunes_file.readline()

...

    fortunes = fortunes_file.readline()

您刚刚重新定义了该变量,因此在while循环结束之后,fortunes实际上是您文件中的最后一行。

您只需使用io.IOBase.readlines()逐行将文件读入列表,然后使用random.choice()随机选择列表中的元素。你自己不需要一个计数器和切片列表

例如:

import random   

# use `with` is recommended here since you don't need close the file manually
with open("fortunes.txt", "r") as f:
    fortunes = fortunes_file.readlinse()

print random.choice(fortunes)

但是,如果您还想知道如何修复代码,只需将io.IOBase.readline()的输出放入如下列表中:

import random 


fortunes_file = open("fortunes.txt", "r")    

fortunes = []
fortunes.append(fortunes_file.readline())   
count = 0


while fortunes != "":
    count += 1
    fortunes.append(fortunes_file.readline())

rand_line = random.randint(1, count)

print fortunes[rand_line]   
fortunes_file.close()

请注意,如果您不想使用.readlines()random.choice(),您仍然不需要该计数器,您也可以使用len(fortunes)来获取长度你的名单而不是自己写一个无用的计数器