Quand les fichiers sont-ils fermés?
Comme nous pouvons l'apprendre La fermeture explicite des fichiers est-elle importante? (StackOverflow) , l'interpréteur Python ferme le fichier dans les cas suivants:
- vous appelez manuellement la
close()
méthode d'un file
objet explicitement ou implicitement en laissant un with open(...):
bloc. Cela fonctionne bien sûr toujours et sur n'importe quelle implémentation Python.
- la
file
dernière référence de l' objet a été supprimée et donc l'objet est traité par le garbage collector. Ce n'est pas une fonctionnalité de langage, mais une fonctionnalité spéciale de l'implémentation CPython uniquement, donc pour la portabilité ne vous fiez pas à cela!
- l'interpréteur Python se termine. Dans ce cas, il devrait fermer tous les descripteurs de fichiers ouverts. Certaines versions plus anciennes de Python3 auraient également imprimé un avertissement que vous devriez les avoir fermées manuellement vous-même. Cependant, imaginez un crash ou vous tuez de force l'interpréteur Python et vous verrez que ce n'est pas non plus fiable.
Donc, seule la première méthode (manuelle) est fiable!
Que se passerait-il si un fichier restait ouvert?
Tout d'abord, selon l'implémentation de votre interpréteur 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é vidées sur le disque jusqu'à ce que vous les induisiez manuellement ou que le gestionnaire de fichiers soit 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 en ouvrant par exemple de nombreux fichiers en boucle dans votre programme Python sans les fermer dès que possible, le système peut refuser d'ouvrir d'autres descripteurs de fichiers pour vous et vous recevrez une exception. Il peut également arriver 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 comme ext4
, où simplement le descripteur de fichier / lien dur vers l'inode du fichier est supprimé / dissocié 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 également le mécanisme qui vous permet de mettre à jour les packages pendant que le logiciel respectif est en cours d'exécution. Cependant, par exemple, NTFS n'a pas une telle fonctionnalité. Cependant, il peut ne jamais être modifié par deux processus simultanés, il sera donc en quelque sorte bloqué pour les autres.
with open (file_name, ...) as variable:
invoque automatiquement laclose()
méthode dès que vous quittez ce bloc de code.