reading - python csv writer example
Python: sin csv.close()? (3)
El lector es solo un analizador. Cuando le pide una línea de datos, delega la acción de lectura en el objeto de file
subyacente y simplemente convierte el resultado en un conjunto de campos. Entonces no hay necesidad de cerrar el lector; sería una operación sin sentido.
Sin embargo, debes asegurarte de cerrar el objeto del 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 el enunciado with
, básicamente incluye sus contenidos en un try...finally
bloque cierra el archivo en la parte finally
. Para Python 2.5 necesitarás una importación __future__
para habilitar la instrucción with
. Si necesita mantener la compatibilidad con las versiones anteriores de Python como 2.4, debe cerrar la sesión usando try...finally
.
Gracias a Jared por señalar problemas de compatibilidad con la declaración with
.
Estoy usando el módulo CSV para leer un archivo delimitado por tabuladores. Código a continuación:
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 me sale un error que dice que el objeto "csv.reader" no tiene ningún atributo ''close'' ".
z.close()
Entonces, ¿cómo cierro "Z"?
No cierra el resultado del método reader()
, cierra el resultado del método open()
. Entonces, use dos declaraciones: foo=open(...); bar=csv.reader(foo)
foo=open(...); bar=csv.reader(foo)
. Entonces puedes llamar a foo.close()
.
No se otorgan puntos de bonificación por hacer en una línea lo que puede ser más legible y funcional en dos.
No cierra lectores CSV directamente; en su lugar, debe cerrar el objeto que se esté utilizando como archivo. 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 ej.
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 regresa dentro del bloque con, mientras que un caso de este tipo daría lugar a 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()