【问题标题】:Why are the contents of the file written only after it is closed?为什么文件的内容只有在关闭后才写入?
【发布时间】:2017-01-13 15:53:33
【问题描述】:

我注意到在 Python 中写入文件时,一旦文件关闭,内容就会写入文件。

例如:

with open('test.txt','w') as ffile:
    ffile.write("testing")
    time.sleep(20)

在本例中,“testing”将在等待 20 秒后写入。

这是如何以及为什么会发生的?为什么不同时写入文件?

【问题讨论】:

  • 请修正缩进。这个问题没有任何意义。缓冲输出就是这样做的。
  • 简而言之缓冲:写入文件是昂贵的(需要很多时间),因此写入被推迟以希望更多内容到达。
  • 对不起,我修好了。
  • 这个问题肯定有重复的..

标签: python file python-3.x file-io


【解决方案1】:

您正在看到缓冲的效果。磁盘 I/O 使用缓冲区来提高性能,但您没有将足够的数据写入缓冲区以使其刷新。

写入更多数据或关闭文件,都会导致缓冲区被刷新。或者,将缓冲区大小设置为非常小的数字(缓冲区将容纳的字节数):

with open('test.txt', 'w', 2) as ffile:

01选项有特殊含义; 0 将完全禁用缓冲(仅适用于 binary 模式文件),1 是文本文件的默认设置(使用 行缓冲,写一个换行符来刷新) .

这也意味着如果你有一个文本文件,你可以写一个换行符来触发刷新:

ffile.write('\n')

最后但同样重要的是,您可以使用 file.flush() method 显式刷新:

ffile.flush()

【讨论】:

  • 谢谢,您能否详细说明如何提高性能,或者至少链接到一个来源?
  • 也许还能解释一下2 的作用。您正在使用的选项。
  • @Ria:见general info on data buffers。物理介质的 I/O ,但带宽很大。您可以将大量数据移动到文件中,但需要一段时间才能到达那里。您不希望您的程序为每个单独的写入付出等待的代价;最好将数据收集到更大的缓冲区中并将内容以块的形式移动到文件中。
  • @MartijnPieters 这就是为什么file.write() 不默认添加换行符吗?因为它会触发潮红?还有一件事,如果使用print('something', file='my_file'),它会因为print 附加换行符而刷新吗?
  • @Ev.Kounis:你为什么要让文件决定你每次写都需要换行符?只有print() 会为您做到这一点;如果您想写入文件并自动添加换行符,请使用 print(.., file=fileobject)
【解决方案2】:
with open('test.txt','w') as ffile:
    ffile.write("testing")
    ffile.flush() # This forces the buffer to be written to the file.
    time.sleep(20)

【讨论】:

  • 语法正确,但几乎没有解释为什么 OP 观察到 内容在文件关闭后写入文件。您可以将其添加到您的答案中吗? (即使flush 声明之后的评论也是一种改进)。
  • @ryyker 谢谢。更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多