2010-03-08 18 views

Respuesta

17

Se debe cerrar el identificador de archivo en la declaración del archivo __del__, pero un mejor enfoque sería utilizar un bloque with:

def read_contents(file_path): 
    with open(file_path, 'r') as f: 
    return f.read() 

Ver http://docs.python.org/library/stdtypes.html#file.close para más información.

+0

Solo para mencionar: el archivo devuelve un objeto de archivo que tiene un método de cierre. Esa sería la solución más directa, pero "con" es obviamente la más agradable. – Achim

+0

Tengo un problema: no tengo 'con' en mi Python. ¿Está bien importar desde el futuro? Tengo Python 2.5. – bodacydo

+0

Si tiene Python 2.5, entonces sí. –

28

Para expandir la respuesta de FogleBird, si no la cierras explícitamente, el archivo se cerrará automáticamente cuando se destruya el objeto del archivo. En CPython esto sucederá tan pronto como no haya más referencias a él, p. si es una variable local en una función y la función finaliza. Sin embargo, si se lanza una excepción en la función y el archivo no se cierra explícitamente usando una declaración with o try:...finally:, se guardará una referencia al archivo como parte del seguimiento de la pila en el objeto de rastreo y el archivo no se cerrará, en menos hasta que se presente la siguiente excepción.

También IronPython y Jython utilizan las instalaciones de recolección de basura de .Net CLR y Java JVM, respectivamente. No se cuentan las referencias, por lo que el archivo permanecerá abierto indefinidamente hasta que el recolector de basura decida reclamar la memoria del objeto o el programa finalice.

Por lo tanto, en general, es importante cerrar el archivo explícitamente utilizando with: o try:...finally:.

Por supuesto, todo esto es válido para cualquier otro tipo de objeto que requiera una limpieza explícita.

+1

+1, todos buenos puntos que no me molesté en mencionar. :) – FogleBird

+1

"no me molestó" - no sabía nada de esto. :( – bodacydo

+0

¡Gracias por mencionar todos estos puntos importantes! – bodacydo

Cuestiones relacionadas