¿Por qué Python no maneja el archivo de versión después de llamar a file.close ()?

Estoy en las ventanas con Python 2.5. Tengo un archivo abierto para escribir. Escribo algunos datos. Cerrar archivo de llamada. Cuando trato de eliminar el archivo de la carpeta con el Explorador de Windows, se produce un error, diciendo que un proceso todavía tiene un identificador para el archivo.

Si apago Python, y lo bash de nuevo, tiene éxito.

Los cierra. ¿Estás seguro de que se llama a f.close ()? Acabo de probar el mismo escenario y Windows elimina el archivo por mí.

¿Está manejando alguna excepción alrededor del objeto de archivo? Si es así, asegúrese de que el manejo de errores se vea algo como esto:

f = open("hello.txt") try: for line in f: print line finally: f.close() 

Al considerar por qué debería hacer esto, considere las siguientes líneas de código:

 f = open('hello.txt') try: perform_an_operation_that_causes_f_to_raise_an_exception() f.close() except IOError: pass 

Como puede ver, nunca se llamará f.close en el código anterior. El problema es que el código anterior también hará que f no obtenga la basura recolectada. La razón es que todavía se hará referencia a f en sys.traceback, en cuyo caso la única solución es cerrar manualmente en f en un bloque finally o configurar sys.traceback en None (y recomiendo encarecidamente la primera).

Explicado en el tutorial:

 with open('/tmp/workfile', 'r') as f: read_data = f.read() 

Funciona cuando escribes o decapado, también

No es realmente necesario que intente bloquear finalmente: la forma Java de hacer las cosas, no Python

Estaba buscando esto, porque me pasó lo mismo. La pregunta no me ayudó, pero creo que me di cuenta de lo que pasó.

En la versión original del script que escribí, olvidé agregar una cláusula “finalmente” al archivo en caso de una excepción.

Estaba probando el script desde el indicador interactivo y obtuve una excepción mientras el archivo estaba abierto. Lo que no me di cuenta es que el objeto de archivo no se recolectó de inmediato. Después de eso, cuando ejecuté el script (aún de la misma sesión interactiva), a pesar de que los nuevos objetos de archivo se estaban cerrando, el primero aún no lo estaba, y por lo tanto el identificador de archivo todavía estaba en uso, desde la perspectiva de El sistema operativo.

Una vez que cerré el indicador interactivo, el problema desapareció, y recordé que ocurría una excepción mientras el archivo estaba abierto y me di cuenta de lo que estaba sucediendo. (Moraleja: No intente progtwigr en falta de sueño.:))

Naturalmente, no tengo idea si esto es lo que sucedió en el caso del póster original, e incluso si el póster original todavía existe, es posible que no recuerden las circunstancias específicas, pero los síntomas son similares, así que pensé en agregar Esto es algo para verificar, para cualquier persona atrapada en la misma situación y buscando una respuesta.