python多久刷新一次文件?

Tim*_*ton 207 python file flush

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

关于(1)我不确定.

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

Cor*_*erg 306

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

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

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

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

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

码:

bufsize = 0
f = open('file.txt', 'w', buffering=bufsize)
Run Code Online (Sandbox Code Playgroud)

  • +1"行缓冲"部分.这正是我所寻找的,它就像一个魅力. (19认同)
  • 请注意,无缓冲 (0) 仅在二进制模式下可用,行缓冲 (1) 仅在文本模式下可用。 (5认同)
  • 当我执行 `open('file.txt', 'w', 1)` 时使用 Python 3.4.3,我得到了正确的行缓冲。但是如果我做更大的事情(我想要 `open('file.txt', 'w', 512)`),它会缓冲 8192 的完整 `io.DEFAULT_BUFFER_SIZE`。这是 Python 错误、Linux 错误还是ID10t错误? (2认同)
  • @CharlieParker当您在文件句柄上调用“write()”时,输出将缓冲在内存中并累积直到缓冲区已满......此时缓冲区将被“刷新”(内容从缓冲区写入文件)。您可以通过在文件句柄上调用“flush()”方法来显式刷新缓冲区。 (2认同)

kor*_*ina 163

您还可以使用该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()
Run Code Online (Sandbox Code Playgroud)

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

  • 从文档:`注意:flush()不一定将文件的数据写入磁盘.使用flush()后跟os.fsync()来确保这种行为 (44认同)
  • 在这个例子中,命令是`os.fsync(f.fileno())` (23认同)
  • @Bruno Bronosky好点.[文档:](https://docs.python.org/2/library/stdtypes.html#file.flush)`注意:flush()不一定将文件的数据写入磁盘.使用flush()后跟os.fsync()来确保这种行为 (4认同)
  • 我感到困惑的是“冲洗”一词的含义。为什么我们需要它?它是做什么用的?我为什么要关心它? (4认同)
  • @bobismijnnaam 下次链接到所述文档。我能找到的唯一参考来自https://github.com/jprzywoski/python-reference/blob/master/source/docs/file/flush.rst,我不知道那是谁。 (2认同)
  • @CharlieParker当你写入时,你会写入RAM中文件(部分)的副本,该副本可能暂时不会保存到磁盘上。它提高了性能,但如果该副本从未被写入(磁盘被删除、操作系统崩溃等),则可能意味着数据丢失。lush() 告诉 Python 立即将该缓冲区写回磁盘。(然后,os.fsync()告诉操作系统也这样做。有很多层缓冲区......) (2认同)

KLe*_*ee1 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()
Run Code Online (Sandbox Code Playgroud)


N R*_*awa 12

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

import io
print (io.DEFAULT_BUFFER_SIZE)
Run Code Online (Sandbox Code Playgroud)