簡體   English   中英

Python 2.7字符串索引錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM