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
3 Réponses :
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()
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") ...
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:
Et
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é.
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?