python多久刷新一次文件?


228
  1. Python多久刷新一次文件?
  2. Python多久刷新一次到stdout?

我不确定(1)。

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

Answers:


332

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

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

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

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

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

码:

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

23
+1为“行缓冲”部分。那正是我在寻找的东西,它就像一种魅力。
控制

2
使用Python 3.4.3时,open('file.txt', 'w', 1)我可以获得适当的行缓冲。但是,如果我做更大的事情(我想要open('file.txt', 'w', 512)),它将缓冲io.DEFAULT_BUFFER_SIZE8192 的全部内容。这是Python错误,Linux错误还是ID10t错误?
布鲁诺·布罗诺斯基

是否可以更改已打开的流的缓冲?说,stdout无论是控制台还是重定向到文件,我都想进行行缓冲?
米哈伊尔T.18年

1
@CharlieParker当您调用write()文件句柄时,输出缓冲在内存中并累积直到缓冲区已满...这时缓冲区被“清除”(内容从缓冲区写入文件)。您可以通过flush()在文件句柄上调用方法来显式刷新缓冲区。
科里·戈德堡

3
请注意,未缓冲(0)仅在二进制模式下可用,而行缓冲(1)仅在文本模式下可用。
ZaydH

172

您也可以使用该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


54
来自文档:Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
bobismijnnaam,2015年

1
@bobismijnnaam下次链接到所述文档。我只能从github.com/jprzywoski/python-reference/blob/master/source/docs/…中找到参考,但我不知道那是谁。
布鲁诺·布罗诺斯基

5
@Bruno Bronosky好点。文件: Note: flush() does not necessarily write the file’s data to disk. Use flush() followed by os.fsync() to ensure this behavior.
bobismijnnaam

我感到困惑的是该术语的flushing含义。我们为什么需要它?这是为了什么 我为什么要关心它?
查理·帕克

@CharlieParker写入时,您将写入RAM中文件的(一部分)副本(可能暂时不会保存到磁盘)。它可以提高性能,但是如果该副本从未被写入(磁盘删除,操作系统崩溃等),则可能意味着数据丢失。flush()告诉Python立即将该缓冲区写回到磁盘。(然后,os.fsync()告诉操作系统也要这样做。缓冲区有很多层...)
Rena

13

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

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

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

编辑:我认为您将以这种方式在python中自动刷新(从此处开始

#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()

12

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

import io
print (io.DEFAULT_BUFFER_SIZE)

1
谢谢!这是很好的知道蟒蛇将其设置OS定义...但是这有助于找出什么操作系统预先定义。
Cometsong

2

这是另一种方法,由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控制界面脚本复制的

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.