ProgrammationDéveloppeur Backend

Décrivez les subtilités de l'utilisation de with open en Python. Que se passe-t-il lors de l'ouverture/fermeture d'un fichier, et quels pièges y a-t-il ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse.

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 piège.

Question fréquente :

Peut-on être sûr que le fichier ouvert via open se fermera immédiatement après la sortie du bloc with, 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().

Exemples d'erreurs réelles dues à une méconnaissance des subtilités du sujet.


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.