web-dev-qa-db-fra.com

Comment ouvrir / fermer en toute sécurité des fichiers dans python 2.4

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?

80
TM.

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().

133
Jon-Eric

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()
32
mljrg

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

2
user3765030