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当前位置我编辑了我的大部分答案