Python3使用requests模块实现显示下载进度的方法详解

 更新时间:2019年02月15日 09:17:19   作者:微寒Super  
这篇文章主要介绍了Python3使用requests模块实现显示下载进度的方法,结合实例形式分析了Python3中requests模块的配置、使用及显示进度条类的相关定义方法,需要的朋友可以参考下

本文实例讲述了Python3使用requests模块实现显示下载进度的方法。分享给大家供大家参考,具体如下:

一、配置request

1. 相关资料

请求关键参数:stream=True。默认情况下,当你进行网络请求后,响应体会立即被下载。你可以通过 stream 参数覆盖这个行为,推迟下载响应体直到访问 Response.content 属性。

tarball_url = 'https://github.com/kennethreitz/requests/tarball/master'
r = requests.get(tarball_url, stream=True)

此时仅有响应头被下载下来了,连接保持打开状态,因此允许我们根据条件获取内容:

if int(r.headers['content-length']) < TOO_LONG:
 content = r.content
 ...

进一步使用 Response.iter_contentResponse.iter_lines 方法来控制工作流,或者以 Response.raw 从底层urllib3的 urllib3.HTTPResponse

from contextlib import closing
with closing(requests.get('http://httpbin.org/get', stream=True)) as r:
  # Do things with the response here.

保持活动状态(持久连接)

归功于urllib3,同一会话内的持久连接是完全自动处理的,同一会话内发出的任何请求都会自动复用恰当的连接!

注意:只有当响应体的所有数据被读取完毕时,连接才会被释放到连接池;所以确保将 stream 设置为 False 或读取 Response 对象的 content 属性。

2. 下载文件并显示进度条

with closing(requests.get(self.url(), stream=True)) as response:
  chunk_size = 1024 # 单次请求最大值
  content_size = int(response.headers['content-length']) # 内容体总大小
  progress = ProgressBar(self.file_name(), total=content_size,
                   unit="KB", chunk_size=chunk_size, run_status="正在下载", fin_status="下载完成")
  with open(file_name, "wb") as file:
    for data in response.iter_content(chunk_size=chunk_size):
      file.write(data)
      progress.refresh(count=len(data))

二、进度条类的实现

在Python3中,print()方法的默认结束符(end='\n'),当调用完之后,光标自动切换到下一行,此时就不能更新原有输出。

将结束符改为“\r”,输出完成之后,光标会回到行首,并不换行。此时再次调用print()方法,就会更新这一行输出了。

结束符也可以使用“\d”,为退格符,光标回退一格,可以使用多个,按需求回退。

在结束这一行输出时,将结束符改回“\n”或者不指定使用默认

下面是一个格式化的进度条显示模块。代码如下:

class ProgressBar(object):
  def __init__(self, title,
         count=0.0,
         run_status=None,
         fin_status=None,
         total=100.0,
         unit='', sep='/',
         chunk_size=1.0):
    super(ProgressBar, self).__init__()
    self.info = "【%s】%s %.2f %s %s %.2f %s"
    self.title = title
    self.total = total
    self.count = count
    self.chunk_size = chunk_size
    self.status = run_status or ""
    self.fin_status = fin_status or " " * len(self.status)
    self.unit = unit
    self.seq = sep
  def __get_info(self):
    # 【名称】状态 进度 单位 分割线 总数 单位
    _info = self.info % (self.title, self.status,
               self.count/self.chunk_size, self.unit, self.seq, self.total/self.chunk_size, self.unit)
    return _info
  def refresh(self, count=1, status=None):
    self.count += count
    # if status is not None:
    self.status = status or self.status
    end_str = "\r"
    if self.count >= self.total:
      end_str = '\n'
      self.status = status or self.fin_status
    print(self.__get_info(), end=end_str)

三、参考资料

http://cn.python-requests.org/en/latest/user/advanced.html

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • TensorFlow 读取CSV数据的实例

    TensorFlow 读取CSV数据的实例

    今天小编就为大家分享一篇TensorFlow 读取CSV数据的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • python实现对数组按指定列排序

    python实现对数组按指定列排序

    这篇文章主要介绍了python实现对数组按指定列排序方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • 手把手教你搭建python+selenium自动化环境(图文)

    手把手教你搭建python+selenium自动化环境(图文)

    本文主要介绍了手把手教你搭建python+selenium自动化环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 在Django的URLconf中使用多个视图前缀的方法

    在Django的URLconf中使用多个视图前缀的方法

    这篇文章主要介绍了在Django的URLconf中使用多个视图前缀的方法,Django是Python中最为著名的遵循MVC结构的开发框架,需要的朋友可以参考下
    2015-07-07
  • Python虚拟环境的创建和使用详解

    Python虚拟环境的创建和使用详解

    这篇文章主要给大家介绍了关于Python虚拟环境的创建和使用的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Django 实现将图片转为Base64,然后使用json传输

    Django 实现将图片转为Base64,然后使用json传输

    这篇文章主要介绍了Django 实现将图片转为Base64,然后使用json传输,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • 使用keras实现densenet和Xception的模型融合

    使用keras实现densenet和Xception的模型融合

    这篇文章主要介绍了使用keras实现densenet和Xception的模型融合,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python3中函数参数的四种简单用法

    python3中函数参数的四种简单用法

    这篇文章主要介绍了python3中函数参数的四种简单用法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-07-07
  • Python 抓取数据存储到Redis中的操作

    Python 抓取数据存储到Redis中的操作

    这篇文章主要介绍了Python 抓取数据存储到Redis中的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • 浅谈python出错时traceback的解读

    浅谈python出错时traceback的解读

    这篇文章主要介绍了浅谈python出错时traceback的解读,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论