如何最好地将StringIO的内容写入文件?

60

如何最佳地将 StringIO 缓冲区的内容写入文件?

我目前的做法类似于:

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

那么buf.getvalue()会复制内容吗?


6
StringIO 对象始终存储在主内存中。如果不想这样,不要使用 StringIO,直接写入文件即可。 - Philipp
1
@Philipp:是的,但是以这种方式使用buf.getvalue()可能会创建内容的副本。 - gauteh
@Philipp 也许程序员想在写入文件之前对StringIO对象执行一些操作? - alercelik
2个回答

97
使用 shutil.copyfileobj 方法:
with open('file.xml', 'w') as fd:
  buf.seek(0)
  shutil.copyfileobj(buf, fd)

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


注意,我必须运行:fd.close() - cooncesean
24
使用 with 关键字时通常不需要这样做。 - gauteh

13

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())

3
这会复制 buf.getvalue() 的值。 - gauteh
1
@gauteh 谢谢,好观点。我认为这对于小型数据非常有用,可以避免需要额外导入的需求,尽管 shutil.copyfileobj 是最佳解决方案,但这让我感到有些奇怪。 - Demitri
2
mode='w' 对于文本文件(如 file.xml)是可以的,但如果内容不是文本,则应使用 mode='wb' 进行二进制写入。 - Ricardo Rivaldo

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