with open(...) as f: — c'est la façon standard de travailler avec des fichiers via un gestionnaire de contexte. Avec cette approche, Python garantit la fermeture automatique du fichier à la sortie du bloc with, même en cas d'exception. Cela élimine les fuites des descripteurs de fichiers et les blocages de fichier.
À l'intérieur du bloc, vous pouvez travailler avec le fichier en utilisant les méthodes de l'objet (f.read(), f.write(), etc.). Après la sortie du bloc (même en cas d'erreur), la méthode f.close() est appelée.
Exemple:
with open('data.txt', 'w') as f: f.write('Hello!') # Ici, le fichier est déjà fermé
Question fréquente :
Peut-on être sûr que le fichier ouvert via
opense fermera immédiatement après la sortie du blocwith, même en cas d'exception au milieu du bloc ?
Réponse : Oui, c'est précisément ce que garantit le contrat du gestionnaire de contexte : indépendamment des exceptions, la méthode __exit__ est appelée à la sortie du bloc, ce qui entraîne la fermeture du fichier. C'est le principal avantage par rapport à l'appel explicite de f.close().
Histoire
Dans un grand projet, les enregistrements de journal étaient effectués via open('log.txt', 'a') et un appel explicite à f.write(), mais on oubliait f.close(). Après un long temps de travail, le processus avait épuisé tous les descripteurs de fichiers du système d'exploitation, le service a cessé de fonctionner.
Histoire
Dans un système de surveillance, on utilisait une ouverture constante de fichiers via open, sans gérer les exceptions. En cas d'erreur, le fichier restait ouvert, ce qui entraînait des blocages lors d'une tentative de réouverture depuis un autre processus.
Histoire
Un développeur a implémenté la lecture d'un grand fichier via open et a immédiatement fait un return au milieu de la fonction, sans fermer le fichier. En conséquence, plusieurs de ces opérations ont conduit à l'épuisement des ressources de fichiers, et le système d'exploitation a commencé à bloquer les nouvelles ouvertures.