En Python, si usted abre un archivo sin llamar close(), o cerrar el archivo, pero no el uso de tryfinally o el «with» declaración», es esto un problema? O es suficiente como una codificación de la práctica para confiar en el Python de recolección de basura para cerrar todos los archivos? Por ejemplo, si uno hace esto:

for line in open("filename"):
    # ... do stuff ...

… ¿esto es un problema porque el archivo no puede ser nunca cerrado y una excepción podría ocurrir que impide que se cierre? O va a ser definitivamente cerrado en la conclusión de la for declaración debido a que el archivo se va fuera de su alcance?

  • El archivo no fuera del ámbito al final de la for bloque. Su recuento de referencia se pondrá a cero, haciendo que se cierra automáticamente, pero sólo funciones, clases, módulos y definir los ámbitos en Python, y no de otros compuestos declaraciones.
  • No es un problema, a menos que sea un problema. A nivel de sistema operativo, los archivos abiertos por el guión será cerrado cuando la secuencia de comandos de salidas, de modo que usted no necesita preocuparse de cerrar archivos en «usar y tirar» de la herramienta de secuencias de comandos. Sin embargo, los procesos tienen un límite en el número de archivos a los que pueden mantener, de manera de larga duración o de secuencias de comandos complejas pueden necesitar ser más cuidadoso. En cualquier caso, es un buen hábito para cerrar sus archivos.
  • Tienes razón en que el archivo no salen de su ámbito, pero no se relaciona con la distinción entre for y bloques de funciones/clases/módulos. Es mucho más sencillo que eso: los objetos no tienen ámbitos, sólo nombres. No hay un nombre que se refiere a este objeto, así que no hay nada aquí para permanecer en el alcance o fuera de ámbito.
  • Mi comentario es la corrección de su suposición de que hay un ámbito asociado con la for bucle, y la mención de que el archivo se cierra de una forma totalmente diferente de la razón. No se en qué ámbitos están en Python, ya que no es relevante aquí.
  • hay una referencia implícita en el ámbito de ese bucle for… este es un argumento de la semántica
InformationsquelleAutor user553702 | 2011-09-13

6 Comentarios

  1. 118

    En su ejemplo, el archivo no está garantizado a ser cerrado antes de que el intérprete sale. En las versiones actuales de CPython el archivo se cierra al final del bucle for, porque CPython usa el conteo de referencias como su principal mecanismo de recolección, pero eso es un detalle de implementación, no una característica de la lengua. Otras implementaciones de Python no están garantizados para trabajar de esta manera. Por ejemplo IronPython, PyPy, y Jython no uso de conteo de referencia y por lo tanto no se cierre el archivo al final del bucle.

    Es una mala práctica para confiar en CPython de recolección de implementación, debido a que el código es menos portable. Puede que usted no tenga pérdidas de recursos si el uso de CPython, pero si alguna vez cambiar a una implementación de Python que no utiliza el conteo de referencias que usted necesita para ir a través de todo el código y asegurarse de que todos sus archivos se cierran correctamente.

    Por su ejemplo de uso:

    with open("filename") as f:
         for line in f:
            # ... do stuff ...
    • ¿El uso de with open() as f cerrar automáticamente el archivo después de que se realiza?
    • sí, es la poca magia que la with declaración de proporcionar, pero, por supuesto, para que esta magia para trabajar el objeto debe tener el especial de los métodos de __enter__ y __exit__, en el segundo, el objeto de hacer la close y cualquier otra limpieza de cosas que necesitan ser hechas en el final de la with declaración…
    • FYI: Esta respuesta sólo se explica «cuando iba a ser cerrado», pero no explica «lo que si se mantiene abierta». Para el último, por favor lea el «¿Qué pasaría si un archivo permanece abierto?» en esta respuesta (askubuntu.com/questions/701491/…)
    • Por otra parte, no es el cierre de los archivos puede resultar en archivos truncados como el contenido de los archivos no han sido vaciados.
    • Así que si no me cierre el archivo, voy a recibir mi memoria por una vez que el programa deja de funcionar? O lo que en realidad tiene que salir de todo el intérprete?
    • Estoy usando Jython 2.7 y CON la instrucción no es una opción. Tengo que usar open() y close().
    • Incluso no está garantizado para ser cerrado en CPython. CPython no garantiza que los objetos que aún existen cuando el intérprete de las salidas tienen sus __del__ método llamado. Por ejemplo, si una excepción para ser lanzado en el cuerpo del bucle y no ser atrapado, el intérprete iba a salir, mientras que contenga una referencia a la rastreabilidad de la última excepción. Al hacerlo, se habría mantenido en el archivo objeto vivo y por lo tanto es poco probable que se cierre (o de color), el archivo.

  2. 22

    Algunos Pitones se cerrará automáticamente los archivos cuando no son referenciados, mientras que otros no y es para el O/S para cerrar los archivos cuando el intérprete de Python salidas.

    Incluso para los Pitones, que cierre los archivos para usted, el tiempo no es garantizado: podría ser inmediato, o podría ser segundos/minutos/horas/días más tarde.

    Así, mientras que usted no puede experimentar problemas con el Python que usted está utilizando, definitivamente no es una buena práctica dejar sus archivos abiertos. De hecho, en cpython 3 ahora usted obtendrá las advertencias de que el sistema tenía que cerrar los archivos para usted si usted no lo hizo.

    Moral: Limpiar después de ti mismo. 🙂

    • Los archivos se cierran cuando ya no se hace referencia en CPython, pero eso no es una característica del lenguaje. Si fue usted podría muy bien depender de ella.
  3. 9

    Aunque es muy seguro de usar dicha construcción en este caso en particular, hay algunas advertencias para la generalización de esta práctica:

    • ejecutar potencialmente puede ejecutar fuera de descriptores de archivo, aunque es poco probable, imaginar la caza de un error como que
    • usted no puede ser capaz de eliminar dicho archivo en algunos sistemas, por ejemplo, de win32
    • si ejecuta otra cosa que CPython, usted no sabe que cuando el archivo está cerrado para usted
    • si abre el archivo para escritura o de lectura-escritura de modo que usted no sabe cuando se vacían datos
  4. 3

    El archivo no conseguir la recolección, y por lo tanto cerrado. La GC determina cuando se cierra, no a usted. Obviamente, esta no es una práctica recomendada porque puede que haga clic en abrir archivo de límite de control si no se cierran los archivos tan pronto como haya terminado con ellos. ¿Y si dentro de ese for bucle de la suya, abrir más archivos y dejarlos persistente?

    • Pero si abrió otros archivos dentro de ese bucle for, todavía sería el caso de haber más de un archivo abierto simultáneamente si se cierra explícitamente alguno de ellos o no. Estás diciendo que el archivo no es necesariamente recolección de basura tan pronto como el archivo sale del ámbito, con lo que se cerraría antes si se hace de forma explícita? ¿Qué pasa cuando una excepción ocurre (cuando se utiliza con/try-finally vs no hacerlo)?
    • En CPython, conteo de referencia es recogido después de la for estado de cuenta, usted no tiene que esperar para la próxima recolección de ejecución.
  5. 3

    Hola es muy importante para cerrar el descriptor de archivo en la situación cuando usted va a utilizar el contenido de la misma secuencia de comandos de python. Yo hoy sí se dan cuenta después de tanto tiempo hecting de depuración. La razón es el contenido será editado/borrado/guardado sólo después de que usted cierra el descriptor de archivo y los cambios se ven afectados a presentar!

    Así que supongamos que usted tiene de la situación que se redacta el contenido a un nuevo archivo y, a continuación, sin cerrar fd está utilizando ese archivo(no fd) en otro de comandos de shell que lee su contenido. En esta situación, usted no va a conseguir que los contenidos de comando de la shell como lo esperado, y si se intenta depurar usted no puede encontrar el error fácilmente. usted también puede leer más en la entrada de mi blog http://magnificentzps.blogspot.in/2014/04/importance-of-closing-file-descriptor.html

  6. 1

    Durante el proceso de e/S, se almacenan los datos: esto significa que se lleva a cabo en una ubicación temporal antes de ser escrito en el archivo.

    Python no vaciar el buffer, es decir, escribir datos en el archivo hasta que sea seguro de que termines de escribir. Una forma de hacerlo es cerrar el archivo.

    Si usted escribe a un archivo sin cerrar, los datos no lo va a hacer en el archivo de destino.

Dejar respuesta

Please enter your comment!
Please enter your name here