Concernant ma question précédente , j'ai remarqué que dans les deux réponses qui utilisaient la open()
fonction, il n'était pas question de fermer le fichier.
J'ai lu que c'était une bonne pratique de le faire, mais est-ce vraiment nécessaire? Est-ce simplement du code inutile?
Le fichier se ferme-t-il automatiquement?
with open (file_name, ...) as variable:
invoque automatiquement laclose()
méthode dès que vous quittez ce bloc de code.python3
, le fichier est automatiquement récupéré une fois qu'il n'a plus de références.Réponses:
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:
close()
méthode d'unfile
objet explicitement ou implicitement en laissant unwith open(...):
bloc. Cela fonctionne bien sûr toujours et sur n'importe quelle implémentation Python.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!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.la source
python3
n'existe plus et la réponse est dépassée. La collecte automatique des déchets existe pour une raison et fonctionne parfaitement. Cela fait des années que je l'ai utiliséclose()
spécifiquement. Jamais jamais rencontré une seule erreur causée par ne pas l'utiliser.