Запись файлов буфера Python по умолчанию. Это делается для повышения производительности.Каждый раз, когда Python записывает в файл (или управляемый ОС поток ввода-вывода, например STDOUT), он должен приостанавливать выполнение и передавать управление ОС.Если ОС занята чем-то другим или если диск, на который вы хотите записать свои данные, занят чем-то другим, вы можете долго ждать ответа.Вместо того, чтобы ждать каждый раз, когда вы хотите что-то записать, Python записывает данные в буфер в памяти, а затем обещает в конечном итоге записать содержимое буфера в файл, как только буфер заполнится (процесс, называемый «очистка» буфера).Это позволяет немедленно продолжить выполнение вашей программы.
При использовании буферов записи существует риск того, что если ваша программа выйдет из строя до того, как буфер будет записан на диск, вы потеряете эти данные.Кроме того, если одна программа выполняет запись в буфер и продолжает выполнение таким образом, нет гарантии, что одновременно работающая программа увидит эти данные на диске до тех пор, пока первая программа каким-либо образом не очистит буфер.Этот второй сценарий является тем, что происходит в вашем примере: IDLE запускает один процесс Python, который записывает в буфер, и вы запускаете второй параллельный процесс для проверки файла, пока IDLE все еще работает.Поскольку буфер не был очищен в IDLE, вы не увидите ничего написанного.Этого не происходит, когда вы запускаете программу из терминала, потому что там завершается процесс Python, и одна из задач очистки, выполняемых при завершении процесса, состоит в очистке всех буферов записи.
Есть много способовзаставить очистить буфер. Python автоматически сбрасывает буферы записи при закрытии файлов , поэтому вы можете попробовать:
f = open("test.txt", "w")
f.write("abc")
f.close()
Предпочтительный способ открывать файлы в Python - использовать менеджер контекста оператора with
.Когда выполнение выходит из блока with
, переменные, созданные в операторе with
, должны очистить себя, что в случае файлов означает их закрытие.Итак, вы можете попробовать:
with open("test.txt", "w") as f:
f.write("abc") # after this block, f is flushed and closed
Если вы хотите оставить файл открытым и вручную очистить буфер записи, Python предоставляет вам метод flush
, так что вы также можете написать:
f = open("test.txt", "w")
f.write("abc")
f.flush() # f remains open
Наконец, вы можете указать Python использовать буфер, размер которого отличается от размера по умолчанию операционной системы, передав аргумент buffering
в open
.Значение 0
указывает Python немедленно сбрасывать каждую запись на диск.Чтобы вы могли сделать это:
f = open("test.txt", "w", buffering=0)
f.write("abc") # f remains open