web-dev-qa-db-fra.com

Ecrire dans un nouveau fichier s'il n'existe pas et ajouter dans un fichier s'il existe

J'ai un programme qui écrit un utilisateur highscore dans un fichier texte. Le fichier est nommé par l'utilisateur lorsqu'il choisit un playername.

Si le fichier avec ce nom d'utilisateur spécifique existe déjà, le programme doit alors être ajouté au fichier (afin que vous puissiez voir plus d'un highscore). Et si un fichier avec ce nom d'utilisateur n'existe pas (par exemple, si l'utilisateur est nouveau), il doit créer un nouveau fichier et y écrire.

Voici le code pertinent, jusqu'à présent ne fonctionne pas,:

try: 
    with open(player): #player is the varible storing the username input
        with open(player, 'a') as highscore:
            highscore.write("Username:", player)

except IOError:
    with open(player + ".txt", 'w') as highscore:
        highscore.write("Username:", player)

Le code ci-dessus crée un nouveau fichier s'il n'existe pas et l'écrit. S'il existe, rien n'a été ajouté lors de la vérification du fichier et je ne reçois aucune erreur.

43
Bondenn

Je ne sais pas exactement où le score élevé qui vous intéresse est stocké, mais le code ci-dessous devrait vous permettre de vérifier si le fichier existe et de l'ajouter si vous le souhaitez. Je préfère cette méthode au "try/except".

import os
player = 'bob'

filename = player+'.txt'

if os.path.exists(filename):
    append_write = 'a' # append if already exists
else:
    append_write = 'w' # make a new file if not

highscore = open(filename,append_write)
highscore.write("Username: " + player + '\n')
highscore.close()
30
qmorgan

Avez-vous essayé le mode 'a +'?

with open(filename, 'a+') as f:
    f.write(...)

Notez cependant que f.tell() renverra 0 dans Python 2.x. Voir https://bugs.python.org/issue22651 pour plus de détails.

55
Eric des Courtis

Ouvrez-le simplement en mode 'a' :

a Ouvert pour l'écriture. Le fichier est créé s'il n'existe pas. Le flux est positionné à la fin du fichier.

with open(filename, 'a') as f:
    f.write(...)

Pour savoir si vous écrivez dans un nouveau fichier, vérifiez la position du flux. Si la valeur est zéro, le fichier était vide ou il s'agit d'un nouveau fichier.

with open('somefile.txt', 'a') as f:
    if f.tell() == 0:
        print('a new file or the file was empty')
        f.write('The header\n')
    else:
        print('file existed, appending')
    f.write('Some data\n')

Si vous utilisez toujours Python 2, pour contourner le problème le bogue , ajoutez f.seek(0, os.SEEK_END) juste après open ou utilisez io.open .

9
user