将 StringIO 的内容写入文件的最佳方法是啥?

Posted

技术标签:

【中文标题】将 StringIO 的内容写入文件的最佳方法是啥?【英文标题】: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 对象进行一些操作? 【参考方案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' 写入二进制文件

以上是关于将 StringIO 的内容写入文件的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中将大文件写入磁盘的最佳方法是啥?

将数组内容保存/加载到文件的最佳方法是啥?

在 Java 的并行线程中写入文件的最佳方法是啥?

将动态内容推送到单独的 html 文件中的最佳方法是啥[关闭]

压缩 Elasticsearch 快照的最佳方法是啥?

在 MATLAB 中存储 16 × (2^20) 矩阵的最佳方法是啥?