[英]Python 2.7 String Index Error
我正在編寫一個程序,使用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
您需要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))
您會在while
循環的每次迭代中覆蓋fortunes
。 在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))
問題在這里:
fortunes = fortunes_file.readline()
...
fortunes = fortunes_file.readline()
您只需重新定義的變量,從而使后while
循環結束, fortunes
實際上是在文件的最后一行。
您可以簡單地使用io.IOBase.readlines()
將文件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)
來獲取列表的長度,而不是編寫無用的計數器你自己 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.