J'écris actuellement un petit script à utiliser sur l'un de nos serveurs en utilisant Python. Le serveur n'a que Python 2.4.4 installé.
Je n'ai pas commencé à utiliser Python jusqu'à la sortie de la version 2.5, je suis donc habitué au formulaire:
with open('file.txt', 'r') as f:
# do stuff with f
Cependant, il n'y a pas d'instruction with
avant la 2.5, et je ne parviens pas à trouver des exemples sur la manière de nettoyer manuellement un objet fichier.
Quelle est la meilleure pratique pour disposer des objets de fichier en toute sécurité lors de l'utilisation d'anciennes versions de Python?
Voir docs.python.org :
Lorsque vous avez terminé avec un fichier, appelez f.close () pour le fermer et libérez toutes les ressources système occupées par le fichier ouvert. Après avoir appelé f.close (), toute tentative d'utilisation de l'objet fichier échouera automatiquement.
Utilisez donc close()
avec élégance avec try/finally
:
f = open('file.txt', 'r')
try:
# do stuff with f
finally:
f.close()
Cela garantit que même si # do stuff with f
Lève une exception, f
sera toujours fermé correctement.
Notez que open
devrait apparaître en dehors de du try
. Si open
lui-même déclenche une exception, le fichier n'a pas été ouvert et il n'est pas nécessaire de le fermer. De plus, si open
lève une exception, son résultat est et non attribué à f
et il est erroné d'appeler f.close()
.
Dans la solution ci-dessus, répétée ici:
f = open('file.txt', 'r')
try:
# do stuff with f
finally:
f.close()
si quelque chose de grave se produit (on ne sait jamais ...) après l'ouverture du fichier et avant l'essai, le fichier ne sera pas fermé. Une solution plus sûre consiste donc à:
f = None
try:
f = open('file.txt', 'r')
# do stuff with f
finally:
if f is not None:
f.close()
Pas besoin de fermer le fichier en fonction de la documentation si vous utilisez avec:
Il est recommandé d’utiliser le mot-clé with lorsqu’il s’agit d’objets fichier. Cela a l'avantage que le fichier est correctement fermé à la fin de la suite, même si une exception est déclenchée. C'est aussi beaucoup plus court que d'écrire des blocs try-finally équivalents:
>>> with open('workfile', 'r') as f:
... read_data = f.read()
>>> f.closed
True
Plus ici: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects