ligne-par-ligne de traitement de dossier, pour la boucle avec vs
Je suis en train d'essayer de comprendre les compromis et les différences entre ces
les moyens de l'ouverture de fichiers pour ligne-par-ligne de traitement
with open('data.txt') as inf:
for line in inf:
#etc
vs
for line in open('data.txt'):
# etc
Je comprends que l'utilisation de with
assure le fichier est fermé lors de l'
"à bloc" (suite?) est sorti (ou une exception est contré). Donc, j'ai été en utilisant with
depuis que j'ai appris sur le sujet ici.
Re for
-boucle: De la recherche à travers le net et DONC, il semble que si le fichier
est fermé lorsque le for
-boucle est sortie est dépendant de l'implémentation? Et
Je ne pouvais pas trouver quelque chose sur la façon dont cette construction de traiter avec
des exceptions. Personne ne sait?
Si je me suis trompé à propos de tout ce qui précède, je vous en serais reconnaissant les corrections,
sinon est-il une raison pour utiliser la for
construire sur le
with
? (En supposant que vous avez un choix, c'est à dire, ne sont pas limités par une version de Python)
OriginalL'auteur Levon | 2012-06-21
Vous devez vous connecter pour publier un commentaire.
Le problème avec ce
Est que vous n'avez pas de garder une référence explicite à l'ouvrir le fichier, donc comment voulez-vous la fermer?
La manière paresseuse, c'est d'attendre pour le garbage collector pour le nettoyer, mais qui peut dire que les ressources ne sont pas libérés en temps opportun.
De sorte que vous pouvez dire
Maintenant ce qui se passe si il y a une exception pendant que vous êtes à l'intérieur de la boucle for? Le fichier ne sera pas fermé explicitement.
Ajouter un
try/finally
C'est beaucoup de code pour faire quelque chose d'assez simple, donc Python ajouté
with
pour activer ce code à écrire dans un moyen plus lisible. Ce qui nous fait iciDonc, c'est le moyen privilégié pour ouvrir le fichier. Si votre Python est trop vieux pour l'instruction, vous devez utiliser le
try/finally
version pour la production de codeOriginalL'auteur John La Rooy
L'instruction n'a été introduite dans Python 2.5 - seulement si vous avez en arrière exigences de compatibilité pour les versions antérieures devriez-vous utiliser ce dernier.
Peu plus de clarté
L'instruction a été introduit (comme vous le savez) pour englober le try/except/enfin le système qui n'est pas terrible pour comprendre, mais bon. En Python (Python en C), la mise en œuvre de celui-ci va fermer les fichiers ouverts. La spécification de la langue elle-même, ne veut pas dire... si IPython, JPython, etc... peuvent choisir de conserver les fichiers ouverts, la mémoire de l'ouvrir, que ce soit, et de ne pas libérer des ressources jusqu'à ce que le prochain cycle de GC (ou à tous les, mais le Disponible GC est différente de la .NET ou Java...).
Je pense que la seule chose que j'ai entendu contre, c'est qu'il ajoute un autre niveau d'indentation.
Donc, pour résumer: ne fonctionne pas < 2.5, introduit le "comme" mot-clé et ajoute un niveau d'indentation.
Sinon, vous conservez le contrôle de la gestion des exceptions que la normale, et enfin la ferme du bloc de ressources si quelque chose vous échappe.
Fonctionne pour moi!
with
alors?Je pense que le retrait est un avantage car il désigne la section qui n'est en vertu d'un contexte donné. Vous devez tiret de toute façon à envelopper l'ensemble du bloc dans un essai sauf que ferme le fichier dans le bloc finally
bon point, mais qu'il en soit connue l'indentation question n'est pas celle que j'ai soulevés - juste celui que j'ai mentionné comme l'ont remarqué il y a des années sur des listes et des groupes.
OriginalL'auteur Jon Clements
Merci de modifier votre réponse à expliquer comment votre code réponses/résout la question ci-dessus. Sinon, c'est juste le commentaire et ne doit pas avoir été publié comme une réponse.
OriginalL'auteur Patrick B