Python多久刷新一次文件?
Python多久刷新一次标准输出?

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

#1 楼

对于文件操作,除非您另行配置,否则Python使用操作系统的默认缓冲。您可以指定缓冲区大小,无缓冲区或行缓冲。例如,open函数采用缓冲区大小参数。

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

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


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

代码:

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


评论


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

–rein
13年3月6日在21:33

当我打开('file.txt','w',1)使用Python 3.4.3时,我得到了适当的行缓冲。但是,如果我做更大的事情(我想要open('file.txt','w',512),它会缓冲io.DEFAULT_BUFFER_SIZE的完整值8192。这是Python错误,Linux错误还是ID10t错误?

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
17年12月1日下午17:00

是否可以更改已打开的流的缓冲?说,我希望stdout是行缓冲的,而不管它是控制台还是重定向到文件?

– Mikhail T.
18-09-23在3:36



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

– Corey Goldberg
19 Mar 5 '19 at 4:59

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

– ZaydH
19年5月8日在7:23

#2 楼

您还可以使用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尾随输出文件时,我发现这很有用。

评论


从文档中获取:注意:flush()不一定会将文件的数据写入磁盘。使用flush()和os.fsync()来确保此行为。

– bobismijnnaam
2015年10月7日在8:08



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

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
17年11月30日在21:33

@布鲁诺·布鲁诺斯基好点。文档:注意:flush()不一定会将文件的数据写入磁盘。使用flush()和os.fsync()来确保此行为。

– bobismijnnaam
17年11月30日在23:08

我感到困惑的是“冲洗”一词的含义。我们为什么需要它?这是为了什么我为什么要关心它?

–查理·帕克(Charlie Parker)
19 Mar 4 '19 at 19:45

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

–雷娜
1月11日20:57



#3 楼

我不知道这是否也适用于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()


#4 楼

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

import io
print (io.DEFAULT_BUFFER_SIZE)


评论


谢谢!很高兴知道python将其设置为操作系统定义...但是这有助于找出操作系统预定义的内容。

–彗星
18 Mar 28 '18 at 13:43

#5 楼

这是另一种方法,由OP来选择他更喜欢的方法。记录到Ableton的Log.txt中,但要分离磁盘上的文件:到用户文件夹的格式将有所不同)。

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