Python вопрос о write () и truncate () - PullRequest
1 голос
/ 09 апреля 2011

Я нахожусь в Терминале на Mac, и я учусь открывать, закрывать, читать, удалять файлы.

Когда я устанавливаю

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

, а затем нажимаю f.truncate() содержимоеdelete.

Однако, когда я делаю f.write(), он не обновляется в текстовом файле.Он обновляется только после того, как я f.truncate().

Мне было интересно, почему это происходит (я думал, f.truncate() должен был удалить текст!)?Почему текстовый редактор не обновляется автоматически при вводе f.write()?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2011

f.write() записывает в собственный буфер процесса Python (аналогично функциям C fwrite()). Однако данные на самом деле не сбрасываются в буферы ОС до тех пор, пока вы не вызовете f.flush() или f.close() или пока буфер не заполнится. Как только вы это сделаете, данные станут видны всем другим приложениям.

Обратите внимание, что ОС выполняет еще один уровень буферизации / кэширования, который используется всеми работающими приложениями. Когда файл сбрасывается, он записывается в эти буферы, но еще не записывается на диск , пока не пройдет некоторое время или когда вы вызовете fsync(). Если ваша ОС выйдет из строя или компьютер потеряет питание, такие несохраненные изменения будут потеряны.

4 голосов
/ 21 мая 2016

Давайте рассмотрим пример:

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
2 голосов
/ 09 апреля 2011

По соображениям производительности вывод в файлы буферизуется.Следовательно, данные могут не записываться в файл до тех пор, пока вы не скажете «записать буфер на диск сейчас».Это традиционно делается с использованием flush().truncate() очевидно сбрасывает перед усечением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...