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

时间:2019-01-30 18:18:23

标签: python python-3.x

我正在为学校项目制作骰子游戏。当您开始游戏时,输入您的名字,它需要从文件“ Player_Names.txt”中读取以前玩过的球员的名字列表,如果该名字不在列表中,那么他们会得到“欢迎”,但如果他们得到了“欢迎回来”。

使用我当前的代码,发生的事情是它只读取文件的第一行,因此,如果名称不在第一行,它将返回一条消息,欢迎新玩家。 另外,如果它是名称的一部分,那么如果您首先输入“ Matthew”,然后再次输入“ Matt”,则会给您一个“ welcome back”消息,但是“ Matt”是另一个人,因此应该是“ welcome”消息。 同样,如果您输入的名称在列表中,但在文件的第二行,您什么也没得到,则程序将继续到下一行代码。

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")  

我如何让程序读取所有行并将输入的单词视为整个单词而不是像“马修”示例中的字母?

2 个答案:

答案 0 :(得分:2)

这里有几个问题:

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和完全匹配来创建性能更高的查询:

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

答案 1 :(得分:1)

您需要读取整个文件并将其按换行符分隔,这样您将获得行列表,并将匹配项与全名进行比较。所以第二行应该是

if player1 in Names.read().split('\n'):