Obtuve este código simple en Python que escribe un "abc" en un archivo de texto llamado test.txt. Ahora, en una Raspberry, ejecute este código con IDLE o Thonny NO funciona, el archivo de texto permanece vacío ... pero, al llamar con el terminal, escribe el texto en el archivo. Alguien puede ayudar?

f = open("test.txt","w") 
f.write("abc")
0
ddd 11 may. 2019 a las 06:16

4 respuestas

La mejor respuesta

Python almacena de forma predeterminada las escrituras de archivos. Lo hace con fines de rendimiento. Cada vez que Python escribe en un archivo (o flujo de E / S controlado por el sistema operativo, como STDOUT), tiene que pausar la ejecución y transferir el control al sistema operativo. Si el sistema operativo está ocupado haciendo otra cosa, o si el disco donde desea escribir sus datos está ocupado haciendo otra cosa, podría estar esperando una respuesta durante mucho tiempo. En lugar de esperar cada vez que quiera escribir algo, Python escribe los datos en un búfer en la memoria, luego promete eventualmente escribir el contenido del búfer en un archivo una vez que el búfer se llene (un proceso llamado "vaciar" el búfer). Esto permite que la ejecución de su programa continúe de inmediato.

El riesgo al usar búferes de escritura es que si su programa se bloquea antes de que el búfer se vacíe en el disco, pierde esos datos. Además, si un programa escribe en un búfer y continúa la ejecución de esta manera, no hay garantía de que un programa en ejecución simultánea vea esos datos en el disco hasta que el primer programa vacíe el búfer de alguna manera. Este segundo escenario es lo que está sucediendo en su ejemplo: IDLE está ejecutando un proceso de Python que escribe en un búfer, y usted está ejecutando un segundo proceso concurrente para verificar el archivo mientras IDLE todavía se está ejecutando. Debido a que el búfer no se ha vaciado en IDLE, no verá nada escrito. Esto no sucede cuando ejecuta el programa desde la terminal porque el proceso de Python termina allí, y una de las tareas de limpieza realizadas cuando finaliza un proceso es vaciar todos los búferes de escritura.

Hay muchas formas de forzar una descarga de búfer. Python descarga automáticamente las memorias intermedias de escritura cuando los archivos están cerrados, para que puedas probar:

f = open("test.txt", "w")
f.write("abc")
f.close()

La forma preferida de abrir archivos en Python es usar un with administrador de contexto de declaración. Cuando la ejecución sale del bloque with, se les dice a las variables creadas en la instrucción with que se limpien, lo que en el caso de los archivos significa cerrarlos. Entonces podrías probar:

with open("test.txt", "w") as f:
    f.write("abc")  # after this block, f is flushed and closed

Si desea mantener el archivo abierto y vaciar manualmente el búfer de escritura, Python le ofrece el método flush, por lo que también podría escribir:

f = open("test.txt", "w")
f.write("abc")
f.flush()  # f remains open

Finalmente, puede decirle a Python que use un búfer de un tamaño diferente al predeterminado del sistema operativo pasando el argumento buffering a open. Un valor de 0 le dice a Python que vacíe inmediatamente cada escritura en el disco. Entonces podrías hacer esto:

f = open("test.txt", "w", buffering=0)
f.write("abc")  # f remains open
4
PaSTE 14 may. 2019 a las 00:37

La mejor práctica de escribir archivos es usar with, se cerrará y liberará su archivo automáticamente.

with open("test.txt","w") as f:
    f.write("abc")
2
Mahmoud Elshahat 11 may. 2019 a las 03:35

Cuando abres explícitamente el archivo haciendo

f = open("test.txt","w") 
f.write("abc")

Debe asegurarse de que está cerrando el archivo al final haciendo f.close(), de lo contrario, los datos que ha escrito en el archivo no se vuelcan al archivo, no importa de dónde ejecute el código , entonces el código será

f = open("test.txt","w") 
f.write("abc")
#Close the file
f.close()

Su otra opción será abrir el archivo usando un administrador de contexto como con, que cierra automáticamente el archivo una vez que finaliza el administrador de contexto

with open("test.txt","w") as f:
    f.write("abc")
0
Devesh Kumar Singh 11 may. 2019 a las 03:58

Intenta llamar a f.close () al final de tu código?

1
Gang Yin 11 may. 2019 a las 03:26