¿Por qué no se escribe un archivo hasta que detengo el progtwig?

Estoy realizando una prueba y descubrí que el archivo no se escribe realmente hasta que controlo C para abortar el progtwig. ¿Alguien puede explicar por qué sucedería eso?

Esperaba que escribiera al mismo tiempo, para poder leer el archivo en medio del proceso.

import os from time import sleep f = open("log.txt", "a+") i = 0 while True: f.write(str(i)) f.write("\n") i += 1 sleep(0.1) 

La escritura en el disco es lenta, por lo que muchos progtwigs almacenan las escrituras en trozos grandes que escriben todos a la vez. Esto se denomina almacenamiento en búfer , y Python lo hace automáticamente cuando abres un archivo.

Cuando escribe en el archivo, en realidad está escribiendo en un “búfer” en la memoria. Cuando se llena, Python lo escribirá automáticamente en el disco. Puedes decirle “escribe todo en el búfer al disco ahora” con

 f.flush() 

Esto no es toda la historia, porque el sistema operativo probablemente también almacenará las escrituras. Puedes decirle que escriba el buffer del archivo con

 os.fsync(f.fileno()) 

Finalmente, puede decirle a Python que no almacene en búfer un archivo particular con open(f, "w", 0) o solo que mantenga un búfer de 1 línea con open(f,"w", 1) . Naturalmente, esto ralentizará todas las operaciones en ese archivo, porque las escrituras son lentas.

Necesita f.close() para vaciar el búfer de escritura del archivo. O en su caso, es posible que desee hacer un f.flush(); os.fsync(); f.flush(); os.fsync(); para que pueda mantener bucle con el identificador de archivo abierto.

No te olvides de import os .

Usted querrá revisar file.flush() – aunque tenga en cuenta que esto podría no escribir los datos en el disco, para citar:

Nota: flush () no necesariamente escribe los datos del archivo en el disco. Use flush () seguido de os.fsync () para asegurar este comportamiento.

Cerrar el archivo ( file.close() ) también asegurará que los datos se escriban; el uso with lo hará de manera implícita, y generalmente es una mejor opción para una mayor legibilidad y claridad, sin mencionar la solución de otros problemas potenciales.

Tienes que forzar la escritura, así que uso las siguientes líneas para asegurarme de que se escribe un archivo:

 # Two commands together force the OS to store the file buffer to disc f.flush() os.fsync(f.fileno()) 

Este es un windows-ism. Si agrega un .close() explícito cuando .close() con el archivo, aparecerá en el explorador en ese momento. Incluso con solo limpiarlo podría ser suficiente (no tengo una caja de Windows a mano para probar). Pero, básicamente, f.write no escribe realmente , solo se agrega al búfer de escritura, hasta que el búfer se vacíe, no lo verá.

En Unix, los archivos normalmente se mostrarán como un archivo de 0 bytes en esta situación.

Manejador de archivos para ser vaciado.

 f.flush() 

El archivo no se escribe, ya que el búfer de salida no se vacía a menos que la recolección de basura se haga efectiva y vacíe el búfer de E / S (lo más probable es que se llame a f.close() ).

Como alternativa, en su bucle, puede llamar a f.flush() seguido de os.fsync() , como se documenta aquí .

 f.flush() os.fsync() 

Dicho todo esto, si alguna vez planea compartir los datos de ese archivo con otras partes de su código, le recomiendo usar un objeto StringIO .