J'enregistre le numéro d'itération de boucle de mon script dans un fichier de point de contrôle:

with open('checkpoint.txt', 'w') as checkpoint_file:
    for i range(1000):
        //do stuff
        checkpoint_file.write(str(i) + '\n')

Cela va écrire une nouvelle ligne dans mon fichier pour chaque itération.

Ce que je voudrais, c'est d'avoir une seule ligne avec le dernier numéro d'itération lorsque j'interromps le script, donc je voudrais effacer le contenu du fichier "checkpoint.txt", puis écrire mon numéro d'itération sur la première ligne (ou directement remplacer la première ligne si cela est possible).

Je sais que si je ferme le fichier, puis l'ouvre à nouveau avec with open('checkpoint.txt', 'w'), son contenu sera effacé, mais j'aimerais garder le fichier ouvert si possible pour plus d'efficacité.

Quelle est la meilleure façon de procéder?

0
Sulli 13 mars 2019 à 14:06

2 réponses

Meilleure réponse

seeking avant chaque write (et passer à la mise en mémoire tampon de ligne pour éviter d'avoir à flush séparément) fera ceci :

# buffering=1 means you automatically flush after writing a line
with open('checkpoint.txt', 'w', buffering=1) as checkpoint_file:
    for i in range(1000):
        //do stuff
        checkpoint_file.seek(0)  # Seek back to beginning of file so next write replaces contents
        checkpoint_file.write(str(i) + '\n')
1
ShadowRanger 13 mars 2019 à 15:55

Cherche au début du fichier avant chaque écriture. Voir https://docs.python.org/2 /library/stdtypes.html?highlight=seek#file.seek

0
Mihai Andrei 13 mars 2019 à 11:09