¿El manejador de archivos se cierra automáticamente en Python después de que está fuera de scope?

Si hago lo siguiente, ¿el identificador de archivo se cierra automáticamente a medida que se sale del scope en Python:

def read_contents(file_path): return file(file_path).read() 

Si no es así, ¿cómo puedo escribir esta función para cerrar el scope automáticamente?

Debería cerrar el identificador de archivo en la statement __del__ del archivo, pero un mejor enfoque sería usar un bloque with :

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

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

Para ampliar la respuesta de FogleBird, si no la cierra 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, por ejemplo, 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 con una sentencia with o try:...finally: entonces se mantendrá una referencia al archivo como parte del seguimiento de la stack en el objeto de rastreo y el archivo no se cerrará, al menos hasta que se lance la siguiente excepción.

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

Entonces, en general, es importante cerrar explícitamente el archivo with: o try:...finally:

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