2016-01-10 5 views
0

Я пишу программу, чтобы выбрать случайную строку из текстового файла, используя время цикла, как счетчик, а затем еще одну переменных, чтобы выбрать случайную строку:Python 2.7 Строки Индекс ошибка

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 

ответ

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)) 
+0

Спасибо - это решение работает для меня! –

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)) 
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), чтобы получить длину своего списка вместо . Напишите бесполезный счетчик.