pyplot - subplot python title
¿Cerrar archivos de forma explícita es importante? (5)
Algunas Pythons cerrarán los archivos de forma automática cuando ya no se les haga referencia, mientras que otras no, y el O / S cerrará los archivos cuando salga el intérprete de Python.
Incluso para las pitones que cerrarán los archivos por usted, el tiempo no está garantizado: podría ser inmediatamente, o podría ser segundos / minutos / horas / días después.
Por lo tanto, aunque es posible que no tenga problemas con el Python que está utilizando, definitivamente no es una buena práctica dejar sus archivos abiertos. De hecho, en cpython 3 ahora recibirás advertencias de que el sistema tuvo que cerrar los archivos por ti si no lo hiciste.
Moraleja: Limpie después de usted mismo. :)
En Python, si abre un archivo sin llamar a close()
, o cierra el archivo pero no usa try
- finally
o la declaración " with
", ¿es esto un problema? ¿O es suficiente como una práctica de codificación confiar en la recolección de basura de Python para cerrar todos los archivos? Por ejemplo, si uno hace esto:
for line in open("filename"):
# ... do stuff ...
... ¿es esto un problema porque el archivo nunca se puede cerrar y puede producirse una excepción que impida que se cierre? ¿O se cerrará definitivamente al finalizar el enunciado for
porque el archivo queda fuera del alcance?
Aunque es bastante seguro usar dicha construcción en este caso particular, existen algunas advertencias para generalizar tal práctica:
- ejecutar puede quedarse sin descriptores de archivo, aunque es poco probable, imagina buscar un error como ese
- es posible que no pueda eliminar dicho archivo en algunos sistemas, por ejemplo, win32
- si ejecuta algo que no sea CPython, no sabe cuándo se cierra el archivo para usted
- si abre el archivo en modo de escritura o de lectura-escritura, no sabe cuándo se borran los datos
El archivo obtiene basura recolectada y, por lo tanto, se cierra. El GC determina cuándo se cierra, no tú. Obviamente, esta no es una práctica recomendada porque puede presionar el límite del identificador de archivo abierto si no cierra los archivos tan pronto como termine de usarlos. ¿Qué pasa si dentro de ese bucle for
tuyo, abres más archivos y los dejas persistentes?
En su ejemplo, no se garantiza que el archivo se cierre antes de que salga el intérprete. En las versiones actuales de CPython, el archivo se cerrará al final del ciclo for porque CPython usa el recuento de referencias como su mecanismo principal de recolección de basura, pero eso es un detalle de implementación, no una característica del lenguaje. No se garantiza que otras implementaciones de Python funcionen de esta manera. Por ejemplo, IronPython, PyPy y Jython no utilizan el recuento de referencias y, por lo tanto, no cerrarán el archivo al final del ciclo.
Es una mala práctica confiar en la implementación de la recolección de basura de CPython porque hace que su código sea menos portátil. Es posible que no tenga pérdidas de recursos si usa CPython, pero si alguna vez cambia a una implementación de Python que no utiliza el recuento de referencias, tendrá que revisar todo su código y asegurarse de que todos sus archivos estén cerrados correctamente.
Para su ejemplo, use:
with open("filename") as f:
for line in f:
# ... do stuff ...
Hola, es muy importante cerrar el descriptor de archivo en una situación en la que vaya a usar su contenido en el mismo script de python. Hoy me doy cuenta de que después de tanto tiempo hechizo la depuración. El motivo es que el contenido se editará / eliminará o guardará solo después de cerrar el descriptor de archivo y los cambios se verán afectados en el archivo.
Supongamos que tiene una situación en la que escribe contenido en un archivo nuevo y luego, sin cerrarlo, usa ese archivo (no fd) en otro comando de shell que lee su contenido. En esta situación, no obtendrá los contenidos para el comando de shell como se esperaba y si intenta depurar no podrá encontrar el error fácilmente. También puedes leer más en mi blog http://magnificentzps.blogspot.in/2014/04/importance-of-closing-file-descriptor.html