Pregunta

Siempre había asumido que un archivo se filtraría si se abriese sin ser cerrado, pero yo sólo comprobado que si entro en las siguientes líneas de código, el archivo se cerrará:

>>> f = open('somefile.txt')
>>> del f

Sólo por curiosidad, ¿cómo funciona esto? Me he dado cuenta de que el archivo no incluye un método __del__.

¿Fue útil?

Solución

En CPython, al menos, los archivos están cerrados cuando se cancela la asignación del objeto de archivo. Véase la función file_dealloc en Objects/fileobject.c en la fuente CPython. métodos dealloc son una especie de como __del__ para los tipos C, excepto sin algunos de los problemas inherentes a __del__.

Otros consejos

Por lo tanto el comunicado.

En Python 2.5, el uso

from __future__ import with_statement

(Para Python 2.6 o 3.x, no hacer nada)

with open( "someFile", "rU" ) as aFile:
    # process the file
    pass
# At this point, the file was closed by the with statement.
# Bonus, it's also out of scope of the with statement,
# and eligible for GC.

Python usa el recuento de referencias y la destrucción determinista, además de la recolección de basura. Cuando no hay más referencias a un objeto, el objeto se libera inmediatamente. Al soltar un archivo cierra.

Esto es diferente que, por ejemplo, Java donde sólo hay recolección de basura no determinista. Esto significa que usted sabe connot cuando se suelta el objeto, por lo que tendrá que cerrar el archivo manualmente.

Tenga en cuenta que la referencia que cuenta no es perfecto. Puede tener objetos con referencias circulares, que no es accesible desde el progama. Es por eso que Python recolección de basura, además de Referencia conteo.

La mejor conjetura es que debido a que el tipo de archivo es un tipo incorporado, el intérprete sí maneja cerrar el archivo en la recolección de basura.

Como alternativa, sólo mirando después de que el intérprete de Python ha salido, y todo "filtrado" manejadores de archivos están cerrados todos modos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top