Как переписать часть текстового файла в Python - PullRequest
0 голосов
/ 29 января 2019

У меня есть текстовый файл, который содержит имя пользователя, пароль и наивысший балл пользователей, однако я хочу перезаписать их высокий балл при достижении высокого балла.Однако я хочу перезаписать только это конкретное значение, а не другие.

Это мой текстовый файл (называемый 'users.txt'):

david 1234abc 34 hannah 5678defg 12 conor 4d3c2b1a 21

Например, если Ханна получаетновая оценка 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")

Извините, коды немного грязные, но я надеюсь, что кто-то можетПомогите.СПАСИБО В РАСШИРЕННОМ, codewizard

Ответы [ 3 ]

0 голосов
/ 29 января 2019

У вас правильная идея (обратите внимание, что ваш код будет работать только для 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")

...
0 голосов
/ 29 января 2019

Ваш формат текстового файла довольно хрупкий.Если Дэвид использует "hannah" в качестве пароля, тогда, когда Ханна пытается обновить свой счет, вместо того, чтобы найти свой счет (шестое поле), он найдет свое имя во втором поле и попытается использовать четвертое поле (ее имя) в качествеее оценка!Любой, кто использует пробел в своем пароле, также может вызвать проблемы, хотя хитрый человек может использовать «abcd 1000000» в качестве своего начального пароля и получить начальный счет как миллион.

Эти проблемы могут быть исправлены с помощью:

  • Использование 1 строки на пользователя или
  • Поиск имен пользователей только в первом из каждых 3 полей

И

  • запрещение пробелов в паролях или
  • кодирование / шифрование паролей

В любом случае вы должны прочитать и сохранить существующие данные, а затем записать всенабор данных в файл.Причина в том, что данные не хранятся в полях фиксированной ширины.Изменение балла с 99 на 100 потребует перемещения всех последующих символов файла на один символ вперед, что не является изменением, которое вы можете внести в файл, фактически не прочитав и не переписав его полностью.

0 голосов
/ 29 января 2019

Вам нужно будет найти и заменить строки.Это означает, что вам нужно будет отформатировать файл 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...