python多久刷新一次文件?

时间:2010-07-02 16:30:42

标签: python file flush

  1. Python多久会刷新一次文件?
  2. Python多久会刷新一次stdout?
  3. 我不确定(1)。

    至于(2),我相信Python在每一行之后都会刷新到stdout。但是,如果你将stdout重载为一个文件,它是否经常刷新?

5 个答案:

答案 0 :(得分:287)

对于文件操作,Python使用操作系统的默认缓冲,除非您另行配置。您可以指定缓冲区大小,无缓冲或行缓冲。

例如,open函数采用缓冲区大小参数。

http://docs.python.org/library/functions.html#open

“可选的缓冲参数指定文件所需的缓冲区大小:”

  • 0表示无缓冲,
  • 1表示行缓冲,
  • 任何其他正值意味着使用(大约)该大小的缓冲区。
  • 负缓冲意味着使用系统默认值,通常为tty设备进行行缓冲,并为其他文件进行完全缓冲。
  • 如果省略,则使用系统默认值。

代码:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)

答案 1 :(得分:151)

您还可以使用flush()方法以编程方式强制将缓冲区刷新到文件。

with open('out.log', 'w+') as f:
    f.write('output is ')
    # some work
    s = 'OK.'
    f.write(s)
    f.write('\n')
    f.flush()
    # some other work
    f.write('done\n')
    f.flush()

我在使用tail -f拖尾输出文件时发现这很有用。

答案 2 :(得分:13)

我不知道这是否也适用于python,但我认为这取决于您正在运行的操作系统。

在Linux上,例如,输出到终端会刷新换行符上的缓冲区,而对于输出到文件,它只会在缓冲区已满时刷新(默认情况下)。这是因为刷新缓冲区的次数更少,并且用户不太可能注意到输出是否未在文件中的换行符上刷新。

如果您需要,可以自动刷新输出。

编辑:我认为你会以这种方式自动刷新python(基于 来自here

#0 means there is no buffer, so all output
#will be auto-flushed
fsock = open('out.log', 'w', 0)
sys.stdout = fsock
#do whatever
fsock.close()

答案 3 :(得分:11)

您还可以通过从io模块调用只读DEFAULT_BUFFER_SIZE属性来检查默认缓冲区大小。

import io
print (io.DEFAULT_BUFFER_SIZE)

答案 4 :(得分:1)

这是另一种方法,直到OP选择他喜欢哪一种。

在任何其他代码之前将__init__。py文件中包含以下代码时,使用print打印的消息和任何错误将不再记录到Ableton的Log.txt中,而是记录在您的单独文件上盘:

import sys

path = "/Users/#username#"

errorLog = open(path + "/stderr.txt", "w", 1)
errorLog.write("---Starting Error Log---\n")
sys.stderr = errorLog
stdoutLog = open(path + "/stdout.txt", "w", 1)
stdoutLog.write("---Starting Standard Out Log---\n")
sys.stdout = stdoutLog

(对于Mac,将#username#更改为用户文件夹的名称。在Windows上,用户文件夹的路径将采用不同的格式)

当您在文本编辑器中打开文件时,当磁盘上的文件发生更改时刷新其内容(例如Mac:TextEdit没有,但TextWrangler没有),您将看到日志正在实时更新。

致谢:此代码主要是由Nathan Ramella的liveAPI控制界面脚本复制的