Для файловых операций Python использует буферизацию операционной системы по умолчанию, если вы не настроите это иначе. Вы можете указать размер буфера, небуферизованный или буферизированный строкой.
Например, функция open принимает аргумент размера буфера.
http://docs.python.org/library/functions.html#open
Msgstr "Необязательный аргумент буферизации указывает желаемый размер буфера файла:"
- 0 означает небуферизованный,
- 1 означает строку в буфере,
- любое другое положительное значение означает использование буфера (приблизительно) этого размера.
- Отрицательная буферизация означает использование системной настройки по умолчанию, которая обычно буферизуется строкой для tty-устройств и полностью буферизуется для других файлов.
- Если опущено, используется системное значение по умолчанию.
код:
bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
open('file.txt', 'w', 1)
я получаю правильную буферизацию строки. Но если я сделаю что-то большее (я хотелopen('file.txt', 'w', 512)
), то он полностьюio.DEFAULT_BUFFER_SIZE
заполнит 8192. Это ошибка Python, ошибка Linux или ошибка ID10t?stdout
использовать линейную буферизацию независимо от того, является ли она консолью или перенаправлена в файл?write()
дескриптор файла, выходные данные буферизуются в памяти и накапливаются до тех пор, пока буфер не заполнится ... в этот момент буфер "очищается" (содержимое записывается из буфера в файл). Вы можете явно очистить буфер, вызвавflush()
метод для дескриптора файла.Вы также можете принудительно сбросить буфер в файл программным
flush()
способом.Я нашел это полезным, когда хвостовой файл с
tail -f
.источник
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
flushing
даже означает. Зачем нам это нужно? Для чего это? почему я должен заботиться об этом?Я не знаю, относится ли это и к Python, но я думаю, что это зависит от операционной системы, которую вы используете.
Например, в Linux вывод в терминал сбрасывает буфер на новую строку, тогда как при выводе в файлы он сбрасывается только при заполнении буфера (по умолчанию). Это потому, что более эффективно очищать буфер меньше раз, и пользователь с меньшей вероятностью заметит, если вывод не сбрасывается на новую строку в файле.
Возможно, вы сможете автоматически очистить вывод, если это то, что вам нужно.
РЕДАКТИРОВАТЬ: Я думаю, что вы бы автоматически сбросить в Python таким образом (на основе здесь )
источник
Вы также можете проверить размер буфера по умолчанию, вызвав атрибут DEFAULT_BUFFER_SIZE только для чтения из модуля io.
источник
Вот другой подход, вплоть до ОП, чтобы выбрать, какой он предпочитает.
При включении приведенного ниже кода в
__init__
файл .py перед любым другим кодом сообщения, напечатанные сprint
ошибками, и любые ошибки больше не будут записываться в файл Ableton Log.txt, а для разделения файлов на вашем диске:(для Mac изменить
#username#
имя вашей пользовательской папки. В Windows путь к вашей пользовательской папке будет иметь другой формат)Когда вы открываете файлы в текстовом редакторе, который обновляет его содержимое при изменении файла на диске (например, для Mac: TextEdit не делает, а TextWrangler делает), вы увидите, что журналы обновляются в режиме реального времени.
Авторы: этот код был скопирован в основном из сценариев панели управления liveAPI Натаном Рамеллой
источник