web-dev-qa-db-fra.com

pour la ligne ouverte (nom de fichier)

Je vois fréquemment python code similaire à

for line in open(filename):
    do_something(line)

Quand le nom de fichier est-il fermé avec ce code?

Serait-il préférable d'écrire

with open(filename) as f:
    for line in f.readlines():
        do_something(line)
29
foosion

filename serait fermé quand il serait hors de portée. Ce serait normalement la fin de la méthode.

Oui, il vaut mieux utiliser with.

Une fois que vous avez un objet fichier, vous effectuez toutes les E/S de fichier en appelant les méthodes de cet objet. [...] Lorsque vous avez terminé avec le fichier, vous devez terminer en appelant la méthode close sur l'objet, pour fermer la connexion au fichier:

input.close()

Dans les scripts courts, les gens omettent souvent cette étape, car Python ferme automatiquement le fichier lorsqu'un objet fichier est récupéré lors de la récupération de place (ce qui en général Python signifie que le Le fichier est fermé presque à la fois, bien que d'autres implémentations importantes de Python, telles que Jython et IronPython, aient d'autres stratégies de récupération de place plus détendues). Néanmoins, il est bon de programmer pour fermer vos fichiers dès que possible, et c'est particulièrement une bonne idée dans les programmes plus importants, qui autrement risqueraient davantage d'avoir un nombre excessif de fichiers ouverts inutilement. Notez que try/finally est particulièrement bien adapté pour garantir la fermeture d'un fichier, même lorsqu'une fonction se termine en raison d'une exception non interceptée.

Livre de recettes Python, page 59.

36
Esteban Küber

La partie with est meilleure car elle ferme le fichier par la suite. Vous n'avez même pas besoin d'utiliser readlines(). for line in file est assez.

Je ne pense pas que le premier le ferme.

8
Loïc Wolff

Supprimez .readlines(). Il est redondant et indésirable pour les fichiers volumineux (en raison de la consommation de mémoire). La variante avec 'with' le bloc ferme toujours le fichier.

with open(filename) as file_:
    for line in file_:
        do_something(line)

Quand le fichier sera fermé à nu 'for'- la variante de boucle dépend de Python implémentation.

6
jfs

python est récupéré - cpython a un comptage de référence et un cycle de sauvegarde détectant le récupérateur de place.

Les objets fichier ferment leur descripteur de fichier lorsqu'ils sont supprimés/finalisés.

Ainsi, le fichier sera finalement fermé et en cpython sera fermé dès que la boucle for se terminera.

3
Douglas Leeder