写入和tempfile.write之间的区别

4
请解释以下内容:
def feed(data):
  import os
  print "DATA LEN: %s" % len(data)
  f = open("copy", "w")
  f.write(data)
  f.close()
  print "FILE LEN: %s" % os.stat("copy").st_size
  t = tempfile.NamedTemporaryFile()
  t.write(data)
  print "TEMP LEN: %s" % os.stat(t.name).st_size
  t.close()

feed(x)
DATA LEN: 11004
FILE LEN: 11004
TEMP LEN: 8192

为什么会出现这种差异,我能修复吗?结尾好像被截断了。
测试过2.6、2.7版本。

我能在文档中看到的唯一区别似乎是,在Windows上你需要添加一个“b”来打开文件,因为Windows区分二进制和非二进制文件,而tempfile自动调用“w+b”。 - Julius F
3
如果在执行stat之前调用.flush()(或.close()),会发生什么? - mgilson
太好了!谢谢。.flush()解决了问题。.close()将删除临时文件。如果您愿意阐明,我会接受的。 - MadMaardigan
就我所知,我之前见过这个神奇数字(8192)... - mgilson
1个回答

5
我认为你遇到了内部写缓冲区大小的问题。在第一个案例中,您在调用 os.stat 之前关闭了文件,这有效地刷新了内部缓冲区。在第二个案例中(使用 tempfile ),当您调用 os.stat 时,文件仍然处于打开状态。由于文件仍然处于打开状态,因此其中的一些内容可能仍然被缓存在内存中,直到您显式地 flush 它或关闭它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接