Python 将文件中的字符读入列表会导致问题
我有一些代码,可以从单词列表中随机选择一个单词,并将其显示在标签上。然后,用户必须重新正确键入该单词才能得分。 我决定使用一个文本文件来存储单词,并将其读入程序中的列表,但这会导致问题Python 将文件中的字符读入列表会导致问题,python,list,file,tkinter,Python,List,File,Tkinter,我有一些代码,可以从单词列表中随机选择一个单词,并将其显示在标签上。然后,用户必须重新正确键入该单词才能得分。 我决定使用一个文本文件来存储单词,并将其读入程序中的列表,但这会导致问题 try: from tkinter import * except ImportError: from Tkinter import * import random with open("WORDS_FILE.txt") as f: WORDS = list(f.readlines()
try:
from tkinter import *
except ImportError:
from Tkinter import *
import random
with open("WORDS_FILE.txt") as f:
WORDS = list(f.readlines())
word_count = 0
def shuffle():
global word
go_btn.pack_forget()
while word_count < 4:
word = random.choice(WORDS)
label.config(text=str(word))
return
def check(event):
global word, word_count
if entry.get().lower() == word.lower():
update_right()
elif entry.get().lower() != word.lower():
update_wrong()
shuffle()
entry.delete(0, END)
def update_right():
global word, word_count
word_count += 1
WORDS.remove(word)
wrong_label.config(text="")
def update_wrong():
global word, word_count
wrong_label.config(text="WRONG!", fg='red')
root = Tk()
label = Label(root, font=("Helvetica", 60))
wrong_label = Label(root, text="", font =("Helvetica, 14"))
go_btn = Button(root, text="GO!", command=shuffle)
entry = Entry(root)
root.bind("<Return>", check)
label.pack()
wrong_label.pack()
go_btn.pack()
entry.pack()
entry.focus_set()
root.mainloop()
我认为错误来自这里:
with open("WORDS_FILE.txt") as f:
WORDS = list(f.readlines()) #Carriage return is given in each line.
在本部分中,您将读取文件的每一行,并使用list
constructor创建一个列表。但是,从文件读取时,每行的末尾都有回车符。因此,基本上,您希望通过在列表的每个字符串上应用.strip('\n')
来删除回车符。这可以像这样天真地完成:
糟糕的做法:
with open("WORDS_FILE.txt") as f:
WORDS = list(f.readlines()) #Carriage return is given in each line.
for i in range(len(WORDS)): # Iterate over list indexes
WORDS[i] = WORDS[i].strip('\n') # In place string replacement.
WORDS = []
with open("WORDS_FILE.txt") as f:
for line in f:
WORDS.append(line.strip('\n'))
虽然这样做了,但在单词列表上迭代两次似乎是不对的(一次是在f.readlines()
中读取文件时,一次是在剥离'\n'
之后)。有两种解决方案可以避免这种情况:
解决方案1:显式文件读取迭代:
with open("WORDS_FILE.txt") as f:
WORDS = list(f.readlines()) #Carriage return is given in each line.
for i in range(len(WORDS)): # Iterate over list indexes
WORDS[i] = WORDS[i].strip('\n') # In place string replacement.
WORDS = []
with open("WORDS_FILE.txt") as f:
for line in f:
WORDS.append(line.strip('\n'))
解决方案2:使用函数映射和lambda表达式,对.readlines()
生成的每个项目应用.strip('\n')
函数:
在读取文件中的单词时,您可能有“行尾”字符。
readlines
不会删除\n
或者这样:对不起,我以为是if语句中的比较造成了问题。谢谢,我尝试单独使用strip()
,但没有效果,不知道我失踪了something@DwainDwarf我敢打赌,如果您解释lambda是如何工作的,以及为什么它比列表理解更好,那么您的问题会更有帮助。你有很多很酷的东西,但我认为新手很难理解到底发生了什么on@PyNExbie当前位置我编辑了我的大部分答案