1
votes

Comment écraser une partie d'un fichier texte en Python?

J'ai un fichier texte qui contient le nom d'utilisateur, le mot de passe et le score le plus élevé des utilisateurs, mais je souhaite écraser leur meilleur score lorsque le score est élevé. Cependant, je souhaite uniquement écraser cette valeur spécifique et aucune autre.

Voici mon fichier texte (appelé 'users.txt'):

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

Par exemple, si ' hannah 'obtient un nouveau score de 15, je veux changer de 12 à 15

Voici ce que j'ai essayé:

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


4 commentaires

Ce que vous voulez faire est essentiellement un accès aléatoire au fichier. Mais les fichiers texte ne sont pas conçus pour cela. Vous pouvez le faire, mais c'est délicat et fragile. Lors du traitement d'un fichier texte, l'approche normale et simple consiste à lire l'ancienne version à partir d'un fichier et à écrire la nouvelle version dans un nouveau fichier. Cela signifie bien sûr que vous devez gérer la suppression de l'ancienne version et renommer la nouvelle version. Le module in_place pypi.org/project/in-place gérera cela pour vous avec élégance.


Une autre option pourrait être une simple base de données sqlite .


Vous pouvez également essayer de l'écrire dans un fichier json. Ce serait une prochaine étape plus facile à partir du fichier texte.


Est-ce que cela répond à votre question? Comment modifier un fichier texte?


3 Réponses :


0
votes

Vous allez devoir rechercher et remplacer les chaînes. Cela signifie que vous devrez formater le fichier users.txt de manière à pouvoir simplement remplacer les données utilisateur. Si vous avez chaque utilisateur et ses données sur une ligne séparée, cela devrait être assez simple:

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


0 commentaires

0
votes

Vous avez la bonne idée (notez que votre code ne fonctionnera que pour 1 utilisateur, mais je vous laisse découvrir comment l'étendre), mais il n'y a aucun moyen de changer le fichier sans écrire le fichier entier.

En tant que tel, je recommande quelque chose comme ceci:

...
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 commentaires

2
votes

Votre format de fichier texte est plutôt fragile. Si David utilise "hannah" comme mot de passe, alors quand Hannah essaie de mettre à jour son score, au lieu de localiser son score (le sixième champ), il trouvera son nom comme deuxième champ et essaiera d'utiliser le quatrième champ (son nom) comme son score! Toute personne utilisant un espace dans son mot de passe poserait également des problèmes, même si une personne sournoise pourrait utiliser «abcd 1000000» comme mot de passe initial et donner un score initial d'un million.

Ces problèmes peuvent être résolus par:

  • En utilisant 1 ligne par utilisateur, ou
  • Recherche de noms d'utilisateurs uniquement dans le premier de tous les trois champs

Et

  • interdiction des espaces dans les mots de passe ou
  • codage / chiffrement des mots de passe

Dans tous les cas, vous devez lire et stocker les données existantes, puis écrire l'intégralité du jeu de données dans le fichier. La raison en est que les données ne sont pas stockées dans des champs de largeur fixe. Un score passant de 99 à 100 nécessitera de déplacer tous les caractères suivants du fichier d'un caractère vers l'avant, ce qui n'est pas une modification que vous pouvez apporter au fichier sans le lire et le réécrire dans son intégralité.


0 commentaires