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"?

41
demandé sur Harpal 2010-07-10 02:31:17

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.

43
répondu David Z 2016-04-03 08:47:36

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()
29
répondu Eli Courtwright 2010-07-09 22:48:25

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.

3
répondu Bryan Oakley 2010-07-09 23:16:59