我有一个 Pylons 控制器操作,需要将文件返回给客户端。 (该文件位于网络根目录之外,因此我不能直接链接到它。)当然,最简单的方法是:
with open(filepath, 'rb') as f:
response.write(f.read())
这可行,但对于大文件来说显然效率低下。最好的方法是什么?我在 Pylons 中找不到任何方便的方法来流式传输文件的内容。我真的需要自己从头开始编写代码来一次读取一个块吗?
正确使用的工具是shutil.copyfileobj,它一次将一个块从一个块复制到另一个块。
用法示例:
import shutil
with open(filepath, 'r') as f:
shutil.copyfileobj(f, response)
这不会导致非常大的内存使用,并且不需要自己实现代码。
应注意异常情况 - 如果您处理信号(例如 SIGCHLD),则必须处理 EINTR,因为对响应的写入可能会被中断,并且在执行 I/O 时可能会因各种原因发生 IOError/OSError。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)