Pregunta de Python sobre write () y truncate ()

Estoy en Terminal en mac y estoy aprendiendo a abrir, cerrar, leer y borrar archivos.

Cuando me puse

f = open("sample.txt", 'w') 

y luego f.truncate() los contenidos borrados.

Sin embargo, cuando hago f.write() no se actualiza en el archivo de texto. Sólo se actualiza después de que hago f.truncate() .

Me preguntaba por qué sucede esto (¡pensé que se suponía que f.truncate() debía eliminar el texto)? ¿Por qué el editor de texto no se actualiza automáticamente cuando f.write() ?

f.write() escribe en el búfer propio del proceso Python (de manera similar a las funciones C fwrite() ). Sin embargo, los datos no se f.flush() realmente en los búferes del sistema operativo hasta que llama a f.flush() o f.close() , o cuando el búfer se llena. Una vez que haces eso, los datos se vuelven visibles para todas las demás aplicaciones.

Tenga en cuenta que el sistema operativo realiza otra capa de almacenamiento en búfer / almacenamiento en caché, que comparten todas las aplicaciones en ejecución. Cuando se descarga el archivo, se escribe en estos búferes, pero aún no se escribe en el disco hasta que haya pasado algún tiempo, o cuando se llama a fsync() . Si su sistema operativo falla o la computadora pierde energía, los cambios no guardados se perderán.

Veamos un ejemplo:

 import os # Required for fsync method: see below f = open("sample.txt", 'w+') # Opens sample.txt for reading/writing # File pointer is at position 0 f.write("Hello") # String "Hello" is written into sample.txt # Now the file pointer is at position 5 f.read() # Prints nothing because file pointer is at position 5 & there # is no data after that f.seek (0) # Now the file pointer is at position 0 f.read() # Prints "Hello" on Screen # Now the file pointer is again at position 5 f.truncate() # Nothing will happen, because the file pointer is at position 5 # & the truncate method truncate the file from position 5. f.seek(0) # Now the file pointer at position 0 f.truncate() # Trucate method Trucates everything from position 0 # File pointer is at position 0 f.write("World") # This will write String "World" at position 0 # File pointer is now at position 5 f.flush() # This will empty the IOBuffer # Flush method may or may not work depends on your OS os.fsync(f) # fsync method from os module ensures that all internal buffers # associated with file are written to the disk f.close() # Flush & close the file object f 

Por razones de rendimiento, la salida a los archivos se almacena en búfer. Por lo tanto, es posible que los datos no se escriban en el archivo hasta más tarde, a menos que le diga “escriba el búfer en el disco ahora”. Esto se hace tradicionalmente usando flush() . truncate() evidentemente se enjuaga antes de truncar.