我有一个文本文件,其中包含用户名,密码和最高分,但是我想在获得高分时覆盖他们的高分。但是,我只想覆盖该特定值,而不能覆盖其他任何值。
这是我的文本文件(称为“ users.txt”):
david 1234abc 34 hannah 5678defg 12 conor 4d3c2b1a 21
例如,如果“ hannah”的新分数为15,我想将12更改为15
这是我在python中尝试过的内容:
# splitting the file
file = open("users.txt","r")
read = file.read()
users = read.split()
file.close()
# finding indexs for username, password and score
usernamePosition1 = users.index(user)
passwordPosition1 = usernamePosition1 + 1
scorePosition1 = passwordPosition1 + 1
file = open("users.txt","a")
# setting previous high score to an integer
player1OldScore = int(users[scorePosition1])
if player1Score > player1OldScore:
# setting in back to a str for text file
player1ScoreStr = str(player1Score)
# from here on i dont really know what i was doing
users.insert([scorePosition1],player1ScoreStr)
file.write(users)
print(player2 + "\n \nAchieved a new high score")
else:
print("\n \n" + player1 + " , you didn't achieve a new high score")
对不起,代码有点混乱,但是我希望有人能提供帮助。 先谢谢了, 代码向导
答案 0 :(得分:1)
您的文本文件格式非常脆弱。如果David使用"hannah"
作为密码,则当Hannah尝试更新其得分时,而不是找到她的得分(第六字段),它将找到她的名字作为第二字段并尝试使用第四字段(她的名字) )作为她的分数!尽管偷偷摸摸的人可以使用“ abcd 1000000”作为初始密码,并将其初始得分设为一百万,但任何人在其密码中使用空格也会引起问题。
这些问题可以通过以下方法解决:
和
无论如何,您必须读入并存储现有数据,然后将整个数据集写出到文件中。原因是数据没有存储在固定宽度的字段中。分数从99变为100时,需要将文件的所有后续字符向前移动一个字符,这是您无需真正读取和重写整个文件即可对文件进行的修改。
答案 1 :(得分:0)
您将需要查找并替换字符串。这意味着您将需要以一种能够简单替换用户数据的方式来格式化users.txt文件。如果您将每个用户及其数据放在单独的一行上,这应该非常容易:
import string
s = open("users.txt","r+")
for line in s.readlines():
print line
string.replace(line, 'hannah 5678defg 12','hannah gfed8765 21')
print line
s.close()
答案 2 :(得分:0)
您有一个正确的想法(请注意,您的代码仅适用于1个用户,但我将让您找出如何扩展它的方法),但是无法在不编写整个文件的情况下更改文件。
因此,我推荐这样的东西:
...
file = open("users.txt","w") # change this from 'a' to 'w' to overwrite
player1OldScore = int(users[scorePosition1])
if player1Score > player1OldScore:
users[scorePosition1] = str(player1Score) # change the score
file.write(" ".join(users)) # write a string with spaces between elements
print(player2 + "\n \nAchieved a new high score")
...