Python: No csv.close ()?

Estoy usando el módulo CSV para leer un archivo delimitado por tabulaciones. Código abajo:

z = csv.reader(open('/home/rv/ncbi-blast-2.2.23+/db/output.blast'), delimiter='\t') 

Pero cuando agrego Z.close () al final de mi script, obtengo un error que dice “csv.reader ‘el objeto no tiene ningún atributo’ close ‘”

 z.close() 

Entonces, ¿cómo cierro “Z”?

El lector es realmente solo un analizador. Cuando le pide una línea de datos, delega la acción de lectura al objeto de file subyacente y simplemente convierte el resultado en un conjunto de campos. Así que no hay necesidad de cerrar el lector; Sería una operación sin sentido.

Sin embargo, debe asegurarse de cerrar el objeto de file subyacente. En Python 2.5+, esta es la manera de hacerlo:

 with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f: z = csv.reader(f, delimiter='\t') 

Si no está familiarizado con la instrucción with , básicamente encierra su contenido en un try...finally bloque que cierra el archivo en la parte finally . Para Python 2.5 necesitará una importación __future__ para habilitar la instrucción with . Si necesitas mantener la compatibilidad con versiones anteriores de Python como 2.4, deberías hacer el cierre tú mismo usando try...finally .


Gracias a Jared por señalar los problemas de compatibilidad con la statement with .

Usted no cierra los lectores CSV directamente; en su lugar, debe cerrar cualquier objeto similar a un archivo que se esté utilizando. Por ejemplo, en tu caso, dirías:

 f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') z = csv.reader(f, delimiter='\t') ... f.close() 

Si está utilizando una versión reciente de Python, puede usar la instrucción with, por ejemplo,

 with open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') as f: z = csv.reader(f, delimiter='\t') ... 

Esto tiene la ventaja de que f se cerrará incluso si lanza una excepción o si regresa dentro del bloque, mientras que tal caso podría hacer que el archivo permanezca abierto en el ejemplo anterior. En otras palabras, es básicamente equivalente a un bloque try / finally, por ejemplo

 f = open('/home/rv/ncbi-blast-2.2.23+/db/output.blast') try: z = csv.reader(f, delimiter='\t') ... finally: f.close() 

No cierra el resultado del método reader() , cierra el resultado del método open() . Por lo tanto, use dos declaraciones: foo=open(...); bar=csv.reader(foo) foo=open(...); bar=csv.reader(foo) . Entonces puedes llamar a foo.close() .

No hay puntos de bonificación otorgados por hacer en una línea lo que puede ser más legible y funcional en dos.