write 和 tempfile.write 之间的区别

Posted

技术标签:

【中文标题】write 和 tempfile.write 之间的区别【英文标题】:Differences between write and tempfile.write 【发布时间】:2014-02-21 11:04:13 【问题描述】:

请解释以下内容:

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"。 如果你在stat 之前.flush()(或.close())会发生什么? 宾果游戏!谢谢你。 .flush() 解决了这个问题。 .close() 将删除临时文件。如果您愿意说明,我会接受。 FWIW,I've seen this magic number (8192) before ... 【参考方案1】:

我认为您遇到了内部写入缓冲区大小。在第一种情况下,您在调用os.stat 之前.close() 文件,这有效地刷新了内部缓冲区。在第二种情况下(使用tempfile),当您调用os.stat 时,文件仍然处于打开状态。由于该文件仍处于打开状态,因此其中一些可能仍会缓冲在内存中,直到您明确地flush 或关闭它。

【讨论】:

以上是关于write 和 tempfile.write 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

read() 和 recv() 以及 send() 和 write() 之间有啥区别?

`nx 受影响:lint --fix` 和 `nx format:write` 之间的区别

python unicode处理print和sys.stdout.write之间的差异

boost async_write() 和 non_blocking socket.send() 之间的区别

Node.js 可写流:write vs _write

在单词之间粘贴输入名称以使用 write.table 保存