我正在编写程序,使用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
答案 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)
来获取长度你的名单而不是自己写一个无用的计数器。