Подтвердить что ты не робот

Python 2.7: мгновенно пишите в файл

Я понял, что когда я пишу в файл с помощью python, дождитесь окончания моего файла Python:

outputFile = open("./outputFile.txt","a")
outputFile.write("First")
print "Now you have 10sec to see that outputFile.txt is still the same as before"
time.sleep(10)
outputFile.write("Second")
print "Now if you look at outputFile.txt you will see 'First' and 'Second'"

Как я могу заставить python мгновенно записывать выходной файл?

4b9b3361

Ответ 1

Вы можете использовать flush(), или вы можете установить, чтобы файл был небуферизован.

Подробности об использовании этого параметра для open() здесь.

Итак, вы измените свой открытый вызов на

outputFile = open("./outputFile.txt", "a", 0)

Ответ 2

Принудите его с помощью функции flush(), добавьте

outputFile.flush()

в конце вашего кода.

Ответ 3

Поскольку @RyPeck сказал, что вы можете использовать flush() или установить файл файл для небуферизации. Но обратите внимание на следующее (с https://docs.python.org/2/library/stdtypes.html?highlight=file%20flush#file.flush):

Сбросьте внутренний буфер, например fflush() stdio.

Примечание. Flush() не обязательно записывает данные файлов на диск. Используйте flush(), за которым следует os.fsync(), чтобы обеспечить такое поведение.

И цитата из man 3 fflush:

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

Ответ 4

Просто чтобы совместить все приведенные выше ответы с набором полезных функций полезности, поскольку ключевое требование OP (и меня!) - "потому что я не хочу каждый раз писать outputFile.flush():

import os
import tempfile
import time


def write_now(filep, msg):
    """Write msg to the file given by filep, forcing the msg to be written to the filesystem immediately (now).

    Without this, if you write to files, and then execute programs
    that should read them, the files will not show up in the program
    on disk.
    """
    filep.write(msg)
    filep.flush()
    # The above call to flush is not enough to write it to disk *now*;
    # according to https://stackoverflow.com/a/41506739/257924 we must
    # also call fsync:
    os.fsync(filep)


def print_now(filep, msg):
    """Call write_now with msg plus a newline."""
    write_now(filep, msg + '\n')


# Example use with the with..as statement:
with tempfile.NamedTemporaryFile(prefix='some_prefix_here.', suffix='.log', dir='.', delete=False) as logf:
    print_now(logf, "this is a test1")
    time.sleep(20)
    print_now(logf, "this is a test2")