2017-02-18 3 views
-1

В чем разница между file.write() и file.flush()?Python: file.write() versus file.flush()

От Python's official documentation, я получаю это:

флеш() Force байт провел в буфере в сырьевой поток. A BlockingIOError должен быть поднят, если блокируется необработанный поток.

напишите (b) Напишите байтоподобный объект, b и верните количество записанных байтов . Когда в неблокирующем режиме, BlockingIOError поднимается , если буфер нужно выписать, но необработанные потоки блокируются.

В лучшем случае, учитывая мое понимание новичков, они оба передают информацию, хранящуюся в памяти в файл на диск. Однако разница в том, что write() также возвращает информацию о том, сколько информации было сохранено, а flush() выполняет эту задачу немедленно. Это верно? В каких обстоятельствах было бы предпочтительнее применять write() для flush() и наоборот?

+2

но 'flush' не принимает аргументов ... они совсем не то же самое. Документ, который вы скопировали, показывает аргумент для 'write' и none для' flush'. 'flush' заставляет данные, записанные с использованием' write', сбрасываться на носитель. –

+0

Вы пытались использовать обе функции? Должно быть ясно, что они делают разные вещи. – mkrieger1

+0

'write()' отправляет данные из вашей программы в подсистему ввода-вывода, где она может быть буферизована. 'flush()' сообщает подсистеме IO, что вы хотите зафиксировать любые данные, которые были буферизованы. –

ответ

2

[См. Также комментарии Стивена Рауча и Питера Вуда] Подумайте об этом в контексте потока, который связан с чем-то, что читается из этого потока на другом конце.

write (b) вносит b в буфер этого потока на вашем конце. Он может или не может фактически поместить все эти байты так, чтобы они были «отправлены» вниз по потоку к читателю на другом конце.

С другой стороны, flush() берет все, что находится в буфере потока, и «отправляет» его читателю.

В принципе, вы используете write (b) для загрузки ваших данных в поток, а затем вы все заподлицо() в конце, чтобы убедиться, что все действительно перешло в базовый поток и «было отправлено», а не сидя в буфере потока.

Так, например, если я подключу свой компьютер к другому устройству с помощью пакета PySerial (который создает последовательное соединение, которое эффективно работает как поток), то, чтобы поместить некоторые данные в этот поток, я буду использовать write (b). Чтобы убедиться, что все эти данные прошли через последовательное соединение и через другое устройство, я вызову flush(). Это связано с тем, что write (b) не гарантирует, что все (или фактически) данные будут фактически отправлены на другое устройство немедленно.

Смежные вопросы