如何在python中覆盖部分文本文件

时间:2019-01-28 21:21:50

标签: python python-3.x text-files

我有一个文本文件,其中包含用户名,密码和最高分,但是我想在获得高分时覆盖他们的高分。但是,我只想覆盖该特定值,而不能覆盖其他任何值。

这是我的文本文件(称为“ 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")

对不起,代码有点混乱,但是我希望有人能提供帮助。 先谢谢了, 代码向导

3 个答案:

答案 0 :(得分:1)

您的文本文件格式非常脆弱。如果David使用"hannah"作为密码,则当Hannah尝试更新其得分时,而不是找到她的得分(第六字段),它将找到她的名字作为第二字段并尝试使用第四字段(她的名字) )作为她的分数!尽管偷偷摸摸的人可以使用“ abcd 1000000”作为初始密码,并将其初始得分设为一百万,但任何人在其密码中使用空格也会引起问题。

这些问题可以通过以下方法解决:

  • 每个用户使用1条线路,或者
  • 仅在每3个字段中的第一个字段中搜索用户名

  • 不允许在密码中添加空格,或
  • 编码/加密密码

无论如何,您必须读入并存储现有数据,然后将整个数据集写出到文件中。原因是数据没有存储在固定宽度的字段中。分数从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")

...