90 votes

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

Je suis en train d'écrire un petit script pour l'utiliser sur l'un de nos serveurs en utilisant Python. Le serveur n'a que Python 2.4.4 d'installé.

Je n'ai commencé à utiliser Python qu'après la sortie de la version 2.5, je suis donc habitué à la forme :

with open('file.txt', 'r') as f:
    # do stuff with f

Cependant, il n'y a pas with avant la version 2.5, et j'ai du mal à trouver des exemples sur la manière correcte de nettoyer manuellement un objet fichier.

Quelle est la meilleure pratique pour éliminer les objets fichiers en toute sécurité lorsque l'on utilise une ancienne version de python ?

144voto

Jon-Eric Points 7749

Ver docs.python.org :

Lorsque vous avez terminé avec un fichier, appelez f.close() pour le fermer et libérer toutes les ressources système utilisées par le fichier ouvert. Après avoir appelé f.close(), les tentatives d'utilisation de l'objet fichier échoueront automatiquement.

D'où l'utilisation close() élégamment 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 soulève une exception, f sera toujours fermé correctement.

Notez que open devrait apparaître à l'extérieur de de la try . Si open soulève elle-même une exception, le fichier n'a pas été ouvert et n'a pas besoin d'être fermé. En outre, si open lève une exception, son résultat est no affecté à f et c'est une erreur d'appeler f.close() .

0 votes

Très simple, merci. Pour une raison quelconque, je m'attendais à avoir besoin de quelque chose de plus compliqué.

17 votes

Si open échoue, une exception sera soulevée avant que la fonction try/finally Le bloc est même entré. Donc close ne sera pas appelé. (C'est pourquoi vous devez appeler open avant le try .)

1 votes

@TM J'ai ajouté une note sur open en soulevant une exception.

33voto

mljrg Points 343

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 avoir ouvert le fichier avec succès et avant l'essai, le fichier ne sera pas fermé, donc une solution plus sûre est :

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()

13voto

user3765030 Points 173

Il n'est pas nécessaire de fermer le fichier selon les docs si vous utilisez avec :

Il est bon d'utiliser le mot-clé with lorsqu'on traite des objets fichiers. Cela présente l'avantage que le fichier est correctement fermé à la fin de sa suite, même si une exception est levée en cours de route. 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 d'informations ici : https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

-5voto

Varun Chhangani Points 152

Voici l'exemple donné qui permet d'utiliser open et "python close

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

Il est nécessaire de savoir combien de fois vous avez ouvert le fichier et combien de fois vous devez le fermer.

1 votes

Si une exception est levée après open mais avant close le dossier ne sera pas correctement fermé en utilisant cette approche. Utilisation de with o try / finally ferme le dossier correctement, même en présence d'exceptions.

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