Python: pas de csv.close()?
J'utilise le module CSV pour lire un fichier délimité par des tabulations. Code ci-dessous:
z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='t')
Mais quand j'ajoute Z. close () à la fin de mon script, je reçois une erreur indiquant " csv.l'objet du lecteur n'a pas d'attribut 'close' "
z.close()
Alors, comment puis-je fermer "Z"?
3 réponses
, Le lecteur est vraiment juste un analyseur. Lorsque vous lui demandez une ligne de données, il délègue l'action de lecture à l'objet file
sous-jacent et convertit simplement le résultat en un ensemble de champs. Donc, il n'y a pas besoin de fermer le lecteur; ce serait une opération sans signification.
Vous devez cependant vous assurer de fermer l'objet file
sous-jacent. En python 2.5+, voici la façon de le faire:
with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f:
z = csv.reader(f, delimiter='\t')
Si vous n'êtes pas familier avec le with
déclaration de, il enferme ses contenu dans un bloc try...finally
qui ferme le fichier dans la partie finally
. Pour Python 2.5, vous aurez besoin d'une importation __future__
pour activer l'instruction with
. Si vous devez conserver la compatibilité avec les versions antérieures de python comme 2.4, vous devriez faire la fermeture vous-même en utilisant try...finally
.
Merci à Jared pour avoir signalé des problèmes de compatibilité avec l'instruction with
.
Vous ne fermez pas directement les lecteurs CSV; vous devez plutôt fermer tout objet de type fichier utilisé. Par exemple, dans votre cas, vous diriez:
f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast')
z = csv.reader(f, delimiter='\t')
...
f.close()
Si vous utilisez une version récente de Python, vous pouvez utiliser l'instruction, par exemple
with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f:
z = csv.reader(f, delimiter='\t')
...
Cela a l'avantage que f
sera fermé même si vous lancez une exception ou si vous retournez dans le bloc with, alors qu'un tel cas conduirait à ce que le fichier reste ouvert dans l'exemple précédent. En d'autres termes, c'est fondamentalement équivalent à un bloc try / finally, par exemple
f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast')
try:
z = csv.reader(f, delimiter='\t')
...
finally:
f.close()
Vous ne fermez pas le résultat de la reader()
méthode, vous fermez le résultat de la open()
méthode. Donc, utilisez deux instructions: foo=open(...); bar=csv.reader(foo)
. Ensuite, vous pouvez appeler foo.close()
.
Il n'y a pas de points bonus attribués pour faire en une ligne ce qui peut être plus lisible et fonctionnel en deux.