La fermeture d'un fichier après l'avoir ouvert avec `open ()` est-elle requise en Python? [fermé]

9

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?

Dis moi pourquoi
la source
1
with open (file_name, ...) as variable:invoque automatiquement la close()méthode dès que vous quittez ce bloc de code.
Byte Commander
1
Copie intersite
Byte Commander
@ByteCommander voulez-vous donner votre commentaire comme réponse, pour rendre cette question «résolue»?
TellMeWhy
1
Dans python3, le fichier est automatiquement récupéré une fois qu'il n'a plus de références.
Jacob Vlijm
4
Je vote pour fermer cette question comme hors sujet car il s'agit d'une question générale sur Python sans connexion avec les scripts sur Ubuntu. c'est une question sur les meilleures pratiques dans un langage de programmation.
terdon

Réponses:

9

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 fileobjet explicitement ou implicitement en laissant un with open(...):bloc. Cela fonctionne bien sûr toujours et sur n'importe quelle implémentation Python.
  • la filederniè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.

Byte Commander
la source
Pas entièrement vrai pour python3 !!
Jacob Vlijm
@JacobVlijm Pourriez-vous l'expliquer?
Byte Commander
Voir le commentaire sous la question. La réponse sur "pas de bonne pratique" dans le lien de votre réponse date de 2011. Si elle a déjà existé, l'avertissement en python3n'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.
Jacob Vlijm
Soo ... Vous savez si les autres implémentations comme PyPy, Jython ou IronPython ferment les fichiers de la même manière que CPython? Et si je tuais l'interprète, il n'aurait pas la possibilité de fermer le dossier, non? Et je pense aussi que la limite de fichiers ouverts s'applique toujours. Qu'en est-il du nettoyage des données écrites? Vous savez quelque chose de plus à jour là-bas?
Byte Commander
1
@JacobVlijm Merci pour l'astuce. : P Ma machine est déjà tombée en panne lors de la création de ce fichier ... Je n'avais même pas besoin de Python pour ça.
Byte Commander