web-dev-qa-db-fra.com

La fermeture d’un fichier après l’avoir ouvert avec `open ()` est-elle requise en Python?

En ce qui concerne ma précédente question , j'ai remarqué que dans les deux réponses utilisant la fonction open(), il n'était pas fait mention de la fermeture du fichier.

J'ai lu que c'est une bonne pratique de le faire, mais y a-t-il un besoin? Est-ce juste un code inutile?

Le fichier est-il fermé automatiquement?

8
TellMeWhy

Quand les fichiers sont-ils fermés?

Comme nous pouvons l’apprendre de La fermeture explicite de fichiers est-elle importante? (StackOverflow) , l’interprète Python ferme le fichier dans les cas suivants:

  • vous appelez manuellement la méthode close() d'un objet file explicitement ou implicitement en laissant un bloc with open(...):. Cela fonctionne bien sûr toujours et sur toute implémentation Python.
  • la dernière référence de l'objet file a été supprimée et l'objet est donc traité par le récupérateur de place. Ce n'est pas une fonctionnalité de langage, mais une fonctionnalité spéciale de la mise en œuvre CPython uniquement. Ne vous fiez donc pas à la portabilité!
  • l'interprète Python se termine. Dans ce cas, devrait fermer tous les descripteurs de fichiers ouverts. Certaines versions plus anciennes de Python3 auraient également imprimé un avertissement vous invitant à les fermer manuellement vous-même. Cependant, imaginez un crash ou si vous tuez de force l'interprète Python et vous verrez que ce n'est pas fiable non plus.

Ainsi, seule la première méthode (manuelle) est fiable!

Que se passerait-il si un fichier restait ouvert?

Tout d’abord, en fonction de l’implémentation de votre interprète Python, si vous avez ouvert un fichier avec un accès en écriture, vous ne pouvez pas être sûr que vos modifications ont été transférées sur le disque tant que vous ne l'avez pas induit manuellement ou que le gestionnaire de fichiers n'a fermé.

Deuxièmement, vous ne pouvez ouvrir qu'un nombre limité de fichiers sur votre système par utilisateur. Si vous dépassez cette limite, par exemple Si vous ouvrez de nombreux fichiers en boucle dans votre programme Python sans les fermer le plus tôt possible, le système peut refuser d'ouvrir d'autres descripteurs de fichiers pour vous et vous recevrez une exception. Il se peut également que votre programme prenne le dernier fichier ouvert autorisé et qu'un autre programme échoue car il est refusé.

Troisièmement, les fichiers ouverts sur un périphérique amovible l'empêchent d'être démonté ou éjecté. Vous pouvez toujours supprimer le fichier sur certains systèmes de fichiers tels que ext4, où simplement le descripteur de fichier/le lien physique vers l'inode du fichier est supprimé/non lié, mais le programme qui a ouvert le fichier peut toujours accéder à l'inode via son propre gestionnaire de fichiers temporaire. C'est par exemple ainsi que le mécanisme qui vous permet de mettre à jour des packages lorsque le logiciel correspondant est en cours d'exécution. Cependant, par exemple NTFS n'a pas cette fonctionnalité. Il peut cependant ne jamais être modifié par deux processus simultanés, il sera donc toujours bloqué pour les autres.

7
Byte Commander