¿Cuándo se cierran los archivos?
Como podemos aprender, ¿es importante cerrar archivos explícitamente? (StackOverflow) , el intérprete de Python cierra el archivo en los siguientes casos:
- Invoca manualmente el
close()
método de un file
objeto explícita o implícitamente dejando un with open(...):
bloque. Esto funciona, por supuesto, siempre y en cualquier implementación de Python.
- la
file
última referencia del objeto se eliminó y, por lo tanto, el recolector de basura procesa el objeto. Esta no es una característica del lenguaje, sino una característica especial de la implementación de CPython solamente, por lo que para la portabilidad no confíe en esto.
- el intérprete de Python termina. En este caso, debería cerrar todos los identificadores de archivo que se abrieron. Algunas versiones anteriores de Python3 también habrían impreso una advertencia de que debería haberlas cerrado manualmente. Sin embargo, imagine un bloqueo o forzar a matar al intérprete de Python y verá que esto tampoco es confiable.
¡Así que solo el primer método (manual) es confiable!
¿Qué pasaría si un archivo permanece abierto?
Primero, dependiendo de la implementación de su intérprete de Python, si abrió un archivo con acceso de escritura, no puede estar seguro de que sus modificaciones se hayan vaciado al disco hasta que lo induzca manualmente o se cierre el controlador de archivos.
En segundo lugar, solo puede abrir una cantidad limitada de archivos en su sistema por usuario. Si excede este límite, por ejemplo, abriendo muchos archivos en un bucle en su programa Python sin cerrarlos lo antes posible, el sistema puede negarse a abrir más identificadores de archivos para usted y recibirá una excepción. También puede suceder que su programa tome el último archivo abierto permitido y otro programa falle porque se rechaza.
En tercer lugar, los archivos abiertos en un dispositivo extraíble evitan que se desmonte o se expulse. Todavía puede eliminar el archivo en algunos sistemas de archivos como ext4
, simplemente, el descriptor de archivo / enlace duro al inodo del archivo se elimina / desvincula, pero el programa que abrió el archivo aún puede acceder al inodo a través de su propio controlador de archivos temporal. Este es, por ejemplo, también el mecanismo que le permite actualizar paquetes mientras se ejecuta el software respectivo. Sin embargo, por ejemplo, NTFS no tiene tal característica. Sin embargo, es posible que nunca se modifique por dos procesos simultáneos, por lo que aún estará bloqueado de alguna manera para otros.
with open (file_name, ...) as variable:
invoca automáticamente elclose()
método tan pronto como abandonas este bloque de código.