Est explicitement la fermeture des fichiers importants?
En Python, si vous ouvrez un fichier sans appel close()
, ou de fermer le fichier, mais pas à l'aide de try
-finally
ou le "with
" déclaration, est-ce un problème? Ou qu'il ne suffit que d'une pratique de codage, de s'appuyer sur le Python garbage-collection pour fermer tous les fichiers? Par exemple, si on fait cela:
for line in open("filename"):
# ... do stuff ...
... est-ce un problème parce que le fichier ne peut jamais être fermé et une exception peut se produire qui l'empêche d'être fermé? Ou cela est-il définitivement fermé à la fin de la for
instruction, car le fichier est hors de portée?
Le fichier n' pas aller hors de portée à la fin de la
Ce n'est pas un problème, sauf si c'est un problème. Au niveau de l'OS, tous les fichiers ouverts par le script sera fermé lorsque le script se termine, vous n'avez pas besoin de s'inquiéter à propos de la fermeture des fichiers dans d'accrochage de l'outil de scripts. Cependant, les processus ont une limite sur le nombre de fichiers ouverts, ils peuvent maintenir, sorte de longue durée ou des scripts complexes peuvent être plus prudent. En tout cas, c'est une bonne habitude de fermer vos fichiers.
Vous avez bien dit que le fichier n'est pas hors de portée, mais il n'est pas lié à la distinction entre
Mon commentaire est la correction de son hypothèse qu'il existe un champ d'application associés à la
il y a une référence implicite étendue que pour la boucle... c'est un argument de la sémantique
for
bloc. Son nombre de références sera à zéro, l'amenant à être fermée automatiquement, mais seulement des fonctions, des classes et des modules de définir les étendues en Python, pas de composés autres états.Ce n'est pas un problème, sauf si c'est un problème. Au niveau de l'OS, tous les fichiers ouverts par le script sera fermé lorsque le script se termine, vous n'avez pas besoin de s'inquiéter à propos de la fermeture des fichiers dans d'accrochage de l'outil de scripts. Cependant, les processus ont une limite sur le nombre de fichiers ouverts, ils peuvent maintenir, sorte de longue durée ou des scripts complexes peuvent être plus prudent. En tout cas, c'est une bonne habitude de fermer vos fichiers.
Vous avez bien dit que le fichier n'est pas hors de portée, mais il n'est pas lié à la distinction entre
for
des blocs et des fonctions/classes/modules. C'est beaucoup plus simple: les objets n'ont pas étendues, seuls les noms ne. Il n'y a pas de nom qui fait référence à cet objet, donc il n'y a rien ici pour rester dans la portée ou hors de portée.Mon commentaire est la correction de son hypothèse qu'il existe un champ d'application associés à la
for
boucle, et mentionnant que le dossier est fermé pour une raison tout à fait différente. Il n'entre pas dans ce sont étendues en Python, comme il n'est pas pertinent ici.il y a une référence implicite étendue que pour la boucle... c'est un argument de la sémantique
OriginalL'auteur user553702 | 2011-09-13
Vous devez vous connecter pour publier un commentaire.
Dans votre exemple, le fichier n'est pas garanti d'être fermé avant l'interprète de sorties. Dans les versions actuelles de Disponible, le fichier est fermé à la fin de la boucle for car Disponible utilise le comptage de référence comme principal mécanisme de collecte des déchets, mais c'est un détail d'implémentation, pas une caractéristique de la langue. D'autres implémentations de Python n'est pas garanti pour fonctionner de cette façon. Par exemple, IronPython, PyPy, et Jython n'utilisez pas de comptage de référence et, par conséquent, de ne pas fermer le fichier à la fin de la boucle.
C'est une mauvaise pratique de compter sur Disponible collecte des ordures de la mise en œuvre, car il rend votre code moins portable. Vous pourriez ne pas avoir les ressources des fuites si vous utilisez Disponible, mais si jamais vous passez à un Python de mise en œuvre qui n'utilise pas de comptage de référence, vous aurez besoin pour passer à travers tout votre code et assurez-vous que tous vos fichiers sont correctement fermé.
Pour votre exemple d'utilisation:
with open() as f
fermer automatiquement le fichier après qu'il est terminé?oui, c'est le peu de magie que le
with
déclaration fournissent, mais bien sûr pour cette magie de travail, l'objet doit avoir la forme particulière de méthodes__enter__
et__exit__
, dans ce dernier, l'objet ne leclose
et tout autre nettoyage de choses qui doivent être faites à la fin de lawith
déclaration...Pour info: Cette réponse n'explique "quand elle serait fermée", mais ne permet pas d'expliquer "que si elle reste ouverte". Pour ce dernier, veuillez lire le "Qu'arriverait-il si un fichier reste ouvert?" dans le cadre de cette réponse (askubuntu.com/questions/701491/...)
De plus, la fermeture des fichiers peuvent entraîner dans les fichiers tronqués comme le contenu du fichier n'ont pas été vidés.
Donc, si je n'ai pas de fermer le fichier, vais-je obtenir mon mémoire de retour pour de bon une fois que le programme s'arrête en cours d'exécution? Ou dois-je réellement quitter de l'ensemble de l'interprète?
OriginalL'auteur Peter Graham
Certains Pythons va se fermer automatiquement les fichiers lorsqu'ils ne sont plus référencés, alors que d'autres non, et c'est à l'O/S pour fermer les fichiers lorsque l'interpréteur Python sorties.
Même pour les Pythons qui va fermer des fichiers pour vous, le moment n'est pas garanti: il pourrait être immédiatement, ou peut-être des secondes/minutes/heures/jours plus tard.
Ainsi, alors que vous ne pouvez pas rencontrer des problèmes avec le Python que vous utilisez, il est certainement préférable de ne pas laisser vos fichiers ouverts. En fait, en disponible 3 vous pouvez maintenant obtenir des avertissements que le système avait pour fermer les fichiers pour vous si vous ne l'avez pas.
Moral: Nettoyer après vous. 🙂
OriginalL'auteur Ethan Furman
Mais il est très sûr à utiliser une telle construction dans ce cas particulier, il y a quelques mises en garde pour la généralisation d'une telle pratique:
OriginalL'auteur Dima Tisnek
Le fichier ne se ramasse miettes, et donc fermé. Le GC détermine quand il se ferme, pas vous. Évidemment, ce n'est pas une pratique recommandée, car vous risquez de vous frapper descripteur de fichier ouvert est limite si vous ne fermez pas les fichiers dès que vous avez fini de les utiliser. Que si, dans ce
for
boucle de la vôtre, vous ouvrez plusieurs fichiers et de les laisser s'attarder?Dans Disponible, le comptage de référence va l'amener à être recueillies après la
for
déclaration, vous n'aurez pas à attendre pour la prochaine collecte de déchets exécuter.OriginalL'auteur Nam Nguyen
Salut, Il est très important de fermer votre descripteur de fichier dans la situation quand vous allez l'utiliser dans le même script python. Je suis aujourd'hui à même de réaliser, après si longtemps, hecting de débogage. La raison en est le contenu sera modifié/retiré/enregistré seulement après la fermeture, vous descripteur de fichier et les changements sont affectés de fichier!
Supposons donc que vous avez la situation que vous écrivez le contenu dans un nouveau fichier et puis, sans fermeture fd vous utilisez ce fichier(pas de fd) dans un autre shell de commande qui lit son contenu. Dans cette situation, vous n'obtiendrez pas vous contenu pour commande shell comme prévu et si vous essayez de déboguer vous ne pouvez pas trouver le bug facilement. vous pouvez aussi lire en plus dans mon entrée de blog http://magnificentzps.blogspot.in/2014/04/importance-of-closing-file-descriptor.html
OriginalL'auteur Zeel Shah
Pendant le processus d'e/S, les données sont mises en mémoire tampon: cela signifie qu'il est détenu dans un emplacement temporaire avant d'être écrites dans le fichier.
Python ne pas vider la mémoire tampon, à écrire des données dans le fichier jusqu'à ce qu'il est sûr que vous avez terminé l'écriture. Une façon de le faire est de fermer le fichier.
Si vous écrivez à un fichier sans fermeture, les données ne sont pas dans le fichier cible.
OriginalL'auteur Sanket Nagrale