使用Python的requests库下载文件并展示进度

作者:rousong2024.04.02 20:58浏览量:3

简介:本文介绍如何使用Python的requests库下载文件,并通过回调函数实时展示下载进度。我们将利用一个自定义的进度类来实现这一功能。

在Python中,使用requests库进行网络请求和文件下载是非常常见的操作。然而,requests库本身并不提供下载进度的直接反馈。为了解决这个问题,我们可以利用requestsstream参数和回调函数来实现下载进度的展示。

首先,我们需要导入必要的库:

  1. import requests
  2. import os
  3. from tqdm import tqdm

这里,tqdm是一个快速、可扩展的Python进度条库,可以在Python长循环中添加一个进度提示信息,用户只需要封装任意的迭代器tqdm(iterator)

接下来,我们定义一个函数来下载文件并展示进度:

  1. def download_file_with_progress(url, destination):
  2. # 创建一个带有进度条的下载器
  3. response = requests.get(url, stream=True)
  4. response.raise_for_status() # 如果请求返回了不成功的状态码,会引发HTTPError异常
  5. total_size = int(response.headers.get('content-length', 0)) # 获取文件总大小
  6. block_size = 1024 # 每次读取的块大小
  7. progress_bar = tqdm(total=total_size, unit='B', unit_scale=True, desc='Downloading')
  8. with open(destination, 'wb') as file, response.iter_content(block_size) as block:
  9. for data in block:
  10. file.write(data)
  11. progress_bar.update(len(data)) # 更新进度条
  12. progress_bar.close() # 关闭进度条

在这个函数中,我们首先发送一个GET请求到指定的URL,并设置stream=True以允许我们逐块接收响应内容。然后,我们获取响应头中的content-length字段来确定文件的总大小。接下来,我们创建一个tqdm进度条,并将其总大小设置为文件总大小。

然后,我们打开一个文件用于写入,并使用response.iter_content()方法逐块读取响应内容。每次读取一块数据后,我们将数据写入文件,并更新进度条。最后,我们关闭进度条。

现在,我们可以调用这个函数来下载文件并展示进度了:

  1. url = 'https://example.com/path/to/file' # 替换为实际的文件URL
  2. destination = 'downloaded_file.ext' # 替换为实际的文件保存路径和文件名
  3. download_file_with_progress(url, destination)

这样,你就可以看到一个动态的下载进度条了。当文件下载完成后,进度条会自动消失。

注意:在实际应用中,你需要替换urldestination变量的值为实际的文件URL和保存路径。此外,你可能还需要处理网络请求可能出现的各种异常,例如超时、连接错误等。这可以通过在requests.get()调用周围添加try...except块来实现。

希望这个示例能帮助你理解如何使用Python的requests库下载文件并展示进度。如有任何疑问或需要进一步的帮助,请随时提问!