我想使用urllib3
通过HTTP
协议下载文件。
我已经使用以下代码成功地做到了这一点:
url = 'http://url_to_a_file'
connection_pool = urllib3.PoolManager()
resp = connection_pool.request('GET',url )
f = open(filename, 'wb')
f.write(resp.data)
f.close()
resp.release_conn()
但我想知道做这件事的正确方法是什么。 例如,它是否能很好地工作在大文件上,如果没有什么可以做的,使这段代码更具容错性和可伸缩性。
注意。例如,使用urllib3
库而不是urllib2
对我来说很重要,因为我希望我的代码是线程安全的。
你的代码片段很接近。有两点值得注意:
如果您正在使用
resp.data
,它将消耗整个响应并返回连接(您不需要手动resp.release_conn()
)。如果你能很好地将数据保存在内存中,这是很好的。您可以使用
resp.read(amt)
来传输响应,但是需要通过resp.release_conn()
返回连接。这看起来像。。。
在这种情况下,文档可能有点缺乏。如果有人对制作pull-request to improve the urllib3 documentation感兴趣,将不胜感激。:)
最正确的方法可能是获取一个表示HTTP响应的类文件对象,并使用shuil.copyfileobj将其复制到一个真实的文件中,如下所示:
相关问题 更多 >
编程相关推荐