如果要在python中显示下载进度,可以使用urllib库中的urlretrieve()函数。根据其文档,这个函数能够将远程数据下载到本地,同时提供一个可选参数"reporthook"。reporthook函数会在下载过程中被多次调用,允许显示下载进度和其他状态信息。
以下是一个简单示例,演示如何使用reporthook参数来显示下载进度。
import urllib.request
def reporthook(count, block_size, total_size):
"""
函数名可以自定义,参数 count 表示当前已经下载的数据块数目,
block_size 表示每个数据块的大小,total_size 表示下载目标的总大小
"""
percent = int(count * block_size * 100 / total_size)
print(f"正在下载:{count * block_size} / {total_size} bytes ({percent}%)")
url = "http://www.example.com/largefile.zip"
urllib.request.urlretrieve(url, filename="largefile.zip", reporthook=reporthook)
当执行这个代码时,下载过程会被显示到终端上,每下载1%就会调用一次reporthook函数。
除了urlretrieve()函数,urllib库还提供了另一个函数urlopen(),允许直接获取下载数据的文件对象。与urlretrieve()函数不同,urlopen()函数必须手动处理数据块的下载流程。但是,这也提供了更大的灵活性,可以使用yield语句在迭代器中自定义数据块处理逻辑。
以下是一个使用urlopen()函数,显示下载进度的示例。
import urllib.request
url = "http://www.example.com/largefile.zip"
response = urllib.request.urlopen(url)
meta = response.info()
file_size = int(meta.get("Content-Length"))
print(f"正在下载:{url} 文件大小为:{file_size} bytes\n")
downloaded_size = 0
block_size = 8192
while True:
data = response.read(block_size)
if not data:
break
downloaded_size += len(data)
percent = int(downloaded_size * 100 / file_size)
print(f"已下载:{downloaded_size} / {file_size} bytes ({percent}%)")
response.close()
以上代码使用urlopen()函数打开文件的数据流,并使用response.info()方法获取文件的元信息。接下来迭代读取数据块,并显示下载进度和数据块的大小。由于response.read()方法可能不会一次返回整块数据,这个示例使用一个while循环来确保数据完全被下载。当response.read()方法返回空数据时,下载过程结束,循环停止。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python的urllib模块显示下载进度示例 - Python技术站