【问题标题】:What is the best way to write the contents of a StringIO to a file?将 StringIO 的内容写入文件的最佳方法是什么?
【发布时间】:2011-03-16 06:13:44
【问题描述】:

StringIO 缓冲区的内容写入文件的最佳方法是什么?

我目前正在做类似的事情:

buf = StringIO()
fd = open('file.xml', 'w')
# populate buf
fd.write(buf.getvalue ())

但是buf.getvalue() 会复制内容吗?

【问题讨论】:

  • StringIO 对象始终存储在主内存中。如果您不想这样,请不要使用StringIO 并直接写入文件。
  • @Philipp:是的,但是以这种方式使用buf.getvalue() 可能(?)创建内容的副本。
  • @Philipp 也许程序员想在写入文件之前对 StringIO 对象进行一些操作?

标签: python file-io stringio


【解决方案1】:

使用shutil.copyfileobj:

with open('file.xml', 'w') as fd:
  buf.seek(0)
  shutil.copyfileobj(buf, fd)

shutil.copyfileobj(buf, fd, -1) 从文件对象复制而不使用有限大小的块(用于避免不受控制的内存消耗)。

【讨论】:

  • 注意到我必须运行:fd.close()
  • @cooncesean:在使用 with 关键字时,这不是必需的。
【解决方案2】:

Python 3:

from io import StringIO
...
with open('file.xml', mode='w') as f:
    print(buf.getvalue(), file=f)

Python 2.x:

from StringIO import StringIO
...
with open('file.xml', mode='w') as f:
    f.write(buf.getvalue())

【讨论】:

  • 这会复制buf.getvalue()
  • @gauteh 谢谢;好点子。我认为这对于避免需要额外导入的小型数据很有用,尽管shutil.copyfileobj 是最好的解决方案让我感到奇怪。
  • mode='w' 适用于文本文件,例如 file.xml,但如果内容不是文本,则应使用 mode='wb' 写入二进制文件
猜你喜欢
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2015-08-30
  • 1970-01-01
  • 2014-02-13
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多