阅读文件并检查数据是否在文件中。Python

3
我正在为学校项目制作一个骰子游戏。当您开始游戏时,输入您的名字并从文件“Player_Names.txt”中读取以前参与过游戏的玩家列表。如果名字不在列表中,则会收到“欢迎”的消息,否则将收到“欢迎回来”的消息。
使用我的当前代码会发生以下情况:它只读取文件中的第一行,因此如果名字不在第一行中,则会给出欢迎新玩家的消息。此外,如果输入的名字是现有玩家姓名的一部分,则无论如何都会收到“欢迎回来”的消息。例如,如果您先输入“Matthew”,然后再次输入“Matt”,您仍会收到“欢迎回来”的消息,但实际上“Matt”是另一个人,应该是“欢迎”的消息。另外,如果您输入的名字在文件的第二行,则程序不会返回任何信息,直接继续执行下一行代码。
Names = open("Player_Names.txt", "r+")  
player1 = input("Enter your name: ")  
if player1 in Names.readline():  
    print("Welcome back you are player 1")  
elif player1 not in Names.readline():  
    print("Welcome you are player 1")  
    Names.write(player1)  
    Names.write("\n")  

如何让程序读取所有行,并将输入的单词作为整个单词而不是字母(例如“Matthew”示例)处理?

3个回答

2
你需要阅读所有的行,使用readline()你只读取了一行... 最初的回答。
Names = open("Player_Names.txt", "r+")  
content = Names.readlines()

content = [x.strip() for x in content] 

if player1 in content:  
    print("Welcome back you are player 1")  
else: 
    print("Welcome you are player 1")  
    Names.write(player1)  
    Names.write("\n")  

1
您不需要使用 readlines 方法,直接使用列表推导式即可对文件进行迭代。content = [x.strip() for x in Names] - chepner
没错。我这样做是因为我认为这对于 @XTG_YOLO 更清晰,因为他对 Python 不太熟悉。 - Lucas Hort
我从来没有使用过 readlines,强调文件是可直接迭代的可能更有益。 - chepner

2

Several issues here:

if player1 in Names.readline():  
    print("Welcome back you are player 1")  
elif player1 not in Names.readline():  

这种结构通常是多余的,因为第一个条件是第二个条件的否定,所以你可以这样写:

此结构通常无用,在此情形下第一个条件是否定第二个条件,因此可如下简写:

if player1 in Names.readline():  
    print("Welcome back you are player 1")  
else:

但在这种情况下,Names.readline() 会有一个副作用,即消耗第一行。因此它们不是等价的。

此外,如果您的文件中有多行,您的算法将无法工作。

我会创建一个包含所有行的list并使用any

最初的回答已经过时,如果你有多行,你可以使用以下代码:

lines = Names.readlines()
if any(player1 in line for line in lines):
   # known player
else:
   # new player

请注意,您可以使用set和精确匹配创建更高效的查找:

最初的回答是:请注意,您可以使用set和精确匹配创建更高效的查找:

lines = {x.strip() for x in Names}
player1 = player1.strip()
if player1 in lines:
   ....
else:

1
你需要读取整个文件并按照换行符分割,这样你将得到行的列表,然后进行匹配以与完整名称进行比较。因此第二行应该是:
if player1 in Names.read().split('\n'):  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接