将 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 的内容写入文件的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章