使用urllib3下载文件的最佳方式是什么

2024-06-17 10:15:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用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对我来说很重要,因为我希望我的代码是线程安全的。


Tags: 文件to代码httpurl协议getrequest
2条回答

你的代码片段很接近。有两点值得注意:

  1. 如果您正在使用resp.data,它将消耗整个响应并返回连接(您不需要手动resp.release_conn())。如果你能很好地将数据保存在内存中,这是很好的。

  2. 您可以使用resp.read(amt)来传输响应,但是需要通过resp.release_conn()返回连接。

这看起来像。。。

import urllib3
http = urllib3.PoolManager()
r = http.request('GET', url, preload_content=False)

with open(path, 'wb') as out:
    while True:
        data = r.read(chunk_size)
        if not data:
            break
        out.write(data)

r.release_conn()

在这种情况下,文档可能有点缺乏。如果有人对制作pull-request to improve the urllib3 documentation感兴趣,将不胜感激。:)

最正确的方法可能是获取一个表示HTTP响应的类文件对象,并使用shuil.copyfileobj将其复制到一个真实的文件中,如下所示:

url = 'http://url_to_a_file'
c = urllib3.PoolManager()

with c.request('GET',url, preload_content=False) as resp, open(filename, 'wb') as out_file:
    shutil.copyfileobj(resp, out_file)

resp.release_conn()     # not 100% sure this is required though

相关问题 更多 >