¿Se requiere cerrar un archivo después de haberlo abierto con `open ()` en Python? [cerrado]

9

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?

Dime por qué
fuente
1
with open (file_name, ...) as variable:invoca automáticamente el close()método tan pronto como abandonas este bloque de código.
Byte Commander
1
Duplicado entre sitios de stackoverflow.com/q/7395542/4464570
Byte Commander
@ByteCommander, ¿quieres dar tu comentario como respuesta para hacer que esta pregunta sea 'resuelta'?
TellMeWhy
1
En python3, el archivo se vuelve basura automáticamente una vez que no tiene más referencias.
Jacob Vlijm
44
Estoy votando para cerrar esta pregunta como fuera de tema porque es una pregunta general sobre Python sin conexión a las secuencias de comandos en Ubuntu. pregunta sobre las mejores prácticas en un lenguaje de programación.
terdon

Respuestas:

9

¿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 fileobjeto 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.

Byte Commander
fuente
¡No es del todo cierto para python3!
Jacob Vlijm
@JacobVlijm ¿Te importaría explicarlo?
Byte Commander
Vea el comentario debajo de la pregunta. La respuesta sobre "no es una buena práctica" en el enlace de su respuesta es de 2011. Si alguna vez existió, la advertencia python3ya 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.
Jacob Vlijm
Entonces ... ¿Sabes si las otras implementaciones como PyPy, Jython o IronPython cierran archivos de la misma manera que CPython? Y si maté al intérprete, no tendría la oportunidad de cerrar el archivo, ¿verdad? Y también creo que el límite de archivo abierto todavía se aplica. ¿Qué pasa con el vaciado de datos escritos? ¿Sabes algo más actualizado allí?
Byte Commander
1
@JacobVlijm Gracias por la sugerencia. : P Mi máquina ya se bloqueó al crear ese archivo ... Ni siquiera necesitaba Python para eso.
Byte Commander