2 votes

Comment remplacer un mot dans un fichier txt

Ok, donc en gros je suis en train de faire un jeu simple qui implique un highscore. Je voudrais que le highscore soit sauvegardé s'il est plus grand que le highscore précédent. Voici mon code. J'ai quelques erreurs différentes, certaines impliquant le fait que je change entre les chaînes et les entiers et d'autres erreurs parce que mon code est tout simplement faux. J'ai essayé de comprendre le problème, mais de nouvelles erreurs semblent continuer à apparaître.

hisc = open("Hscore.txt", "r+")
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
    hiscore = hiscore.replace(hiscore, score)
    hisc.write(hiscore)

C'était ma dernière tentative. Il pourrait être 100% faux, j'ai fait de mon mieux. Ce dont j'ai besoin, c'est que chaque fois que je lance le jeu, il affiche mon meilleur score. Si mon score est supérieur à mon highscore, le highscore dans le fichier texte est modifié. Il est ensuite rechargé dans le jeu pour agir à nouveau dans ce code.

3voto

abarnert Points 94246

Le problème avec votre code est que vous essayez d'appeler hiscore.replace quand hiscore est un int .

Je ne suis pas sûr de savoir pourquoi vous essayez d'utiliser replace en premier lieu. C'est utile pour remplacer une partie d'une chaîne par une autre chaîne. Si vous voulez remplacer la totalité de la chaîne, il suffit d'attribuer une nouvelle valeur : hiscore = score .

hisc = open("Hscore.txt", "r+")
hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
    hiscore = score
    hisc.write(hiscore)

Cependant, vous avez un deuxième problème : vous écrivez une int dans un fichier, alors que ce que vous voulez (je pense) c'est la représentation en chaîne de ce fichier. int comme exactement 3 caractères. Donc, remplacez la dernière ligne par celle-ci :

    hisc.write('{:3}'.format(hiscore))

Entre-temps, l'ouverture d'un fichier dans "r+" n'est pas forcément ce que vous pensez. Dans Python 3, le "pointeur de lecture" et le "pointeur d'écriture" sont toujours au même endroit pour un fichier "r+". Ainsi, si vous lisez 3 caractères, puis écrivez 3 caractères, vous finissez par écraser les caractères 3 à 6, ou par ajouter 3 nouveaux caractères à la fin, au lieu d'écraser les caractères 0 à 3 comme vous le souhaitez. Vous pouvez gérer ce problème en appelant seek(0, 0) après le read .

Enfin, vous n'avez jamais close le fichier, ce qui signifie que ce que vous avez écrit peut ne jamais être sauvegardé - il peut rester dans un tampon en mémoire et ne jamais être transféré vers le fichier disque. Et il est probablement plus simple ici d'ouvrir en lecture, puis de fermer, puis d'ouvrir en écriture, puis de fermer, de sorte que vous n'ayez pas à vous soucier de tout cela seek absurde. La manière la plus simple de fermer des fichiers est d'utiliser un fichier de type with déclaration.

Donc, en mettant tout ça ensemble :

with open("Hscore.txt", "r") as hisc:
    hiscore = hisc.read(3) # 3 because the max score would never reach 1000
highscore = int(hiscore)
if score > highscore:
    with open("Hscore.txt", "w") as hisc:
        hisc.write('{:3}'.format(score))

Mais cela repose sur le fait que l'existence de Hscore.txt est garantie (dans le répertoire de travail actuel), et qu'il contient un nombre. Si un bug vous amène à y coller un "x", ou à vider entièrement le fichier, vous obtiendrez une exception à chaque exécution, et vous ne pourrez jamais récupérer. Donc, vous pouvez vouloir quelque chose comme ceci :

try:
    with open("Hscore.txt", "r") as hisc:
        hiscore = hisc.read(3) # 3 because the max score would never reach 1000
    highscore = int(hiscore)
except IOError as e:
    print('Warning: couldn't open "Hscore.txt": {}'.format(e))
    highscore = 0
except ValueError as e:
    print('Warning: couldn't convert "{}" from "Hscore.txt" to an integer: {}'.format(hiscore, e))
    highscore = 0

De cette façon, il imprimera un avertissement qui vous aidera à comprendre ce qui ne va pas et à essayer de récupérer (en supposant qu'un fichier manquant ou corrompu signifie que le score le plus élevé est 0).

El open et la documentation io Aperçu du module explique la plupart de ces choses, mais ce n'est pas vraiment adapté aux débutants. Lecture et écriture de fichiers dans le tutoriel peut être plus utile.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X