python的urllib模块显示下载进度示例


在Python中,`urllib` 模块本身并不直接提供下载进度条的功能,但你可以通过结合 `urllib.request` 和自定义的回调函数来实现这一功能。这里是一个简单的示例,展示如何在使用 `urllib.request.urlretrieve` 函数下载文件时显示下载进度:


from urllib.request import urlretrieve
from urllib.parse import urlparse
import os

def report_hook(block_num, block_size, total_size):
    """
    这是一个回调函数,用于报告下载进度。
    :param block_num: 当前已下载的块编号(从0开始)
    :param block_size: 每个块的大小
    :param total_size: 文件总大小
    """
    # 如果文件总大小为0(未知),则不打印进度
    if total_size == -1:
        print('下载中...')
    else:
        # 计算已下载的大小
        downloaded_size = block_num * block_size
        # 计算百分比
        percent = (downloaded_size / total_size) * 100
        # 显示进度条
        print(f"\r下载进度: {percent:.2f}% [{downloaded_size}/{total_size}]", end='', flush=True)

# 要下载的文件URL
url = 'http://example.com/somefile.zip'
# 保存文件的本地路径
filepath = os.path.join(os.getcwd(), urlparse(url).path.split('/')[-1])

# 使用urlretrieve下载文件,并传入回调函数
urlretrieve(url, filepath, reporthook=report_hook)

# 下载完成后,打印换行符以清除进度条
print()
print(f"文件已保存到: {filepath}")

请注意,这个示例中的 `url` 应该是有效的,且文件大小不应为0,以便能够正确显示下载进度。由于我无法直接访问外部资源,因此这里使用了一个假设的URL `http://example.com/somefile.zip`。在实际应用中,你需要替换为有效的文件URL。

此外,`urllib.request.urlretrieve` 函数在较新版本的Python中可能被视为不推荐使用的(deprecated),建议使用 `requests` 库配合流式下载来实现更复杂或更灵活的下载需求,包括下载进度显示。然而,按照你的人设要求,我仍然提供了一个基于 `urllib` 的示例。