Requests是一个非常好的库。我想用它来下载大文件(>;1GB)。 问题是无法将整个文件保存在内存中,我需要将其分块读取。下面的代码有问题
import requests
def DownloadFile(url)
local_filename = url.split('/')[-1]
r = requests.get(url)
f = open(local_filename, 'wb')
for chunk in r.iter_content(chunk_size=512 * 1024):
if chunk: # filter out keep-alive new chunks
f.write(chunk)
f.close()
return
因为某种原因它不能这样工作。它仍然会在将响应保存到文件之前将其加载到内存中。
更新
如果您需要一个小客户机(Python 2.x/3.x),它可以从FTP下载大文件,您可以找到它here。它支持多线程重新连接(它监视连接),还为下载任务调整套接字参数。
使用以下流代码,无论下载文件的大小如何,Python内存使用都会受到限制:
注意,使用
iter_content
返回的字节数并不完全是chunk_size
;它应该是一个通常大得多的随机数,并且在每次迭代中都应该是不同的。请参阅http://docs.python-requests.org/en/latest/user/advanced/#body-content-workflow以获取进一步的参考。
使用^{} 和^{} 会容易得多:
这将文件流式传输到磁盘而不使用过多的内存,并且代码很简单。
不完全是OP的要求,但是。。。用
urllib
很容易做到这一点:或者这样,如果要将其保存到临时文件中:
我观察了这个过程:
我看到文件在增长,但内存使用量保持在17MB。我遗漏了什么吗?
相关问题 更多 >
编程相关推荐