Con respecto a mi pregunta anterior , noté que en ambas respuestas que usaban la open()
función, no se mencionaba el cierre del archivo.
He leído que es una buena práctica hacerlo, pero ¿hay alguna necesidad de hacerlo? ¿Es solo código innecesario?
¿El archivo se cierra automáticamente?
with open (file_name, ...) as variable:
invoca automáticamente elclose()
método tan pronto como abandonas este bloque de código.python3
, el archivo se vuelve basura automáticamente una vez que no tiene más referencias.Respuestas:
¿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:
close()
método de unfile
objeto explícita o implícitamente dejando unwith open(...):
bloque. Esto funciona, por supuesto, siempre y en cualquier implementación de Python.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.¡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.fuente
python3
ya no existe y la respuesta está desactualizada. La recolección automática de basura existe por una razón y funciona perfectamente. Han pasado años desde que lo uséclose()
específicamente. Nunca se topó con un solo error causado por no usarlo.