python 实现下载进度条的方法

第一种(简单).python实现简单的进度条的方法

import sys
for i in range(101):
    s="\r%d%% %s"%(i,"#"*i)   #\r表示回车但是不换行,利用这个原理进行百分比的刷新
    sys.stdout.write(s)       #向标准输出终端写内容
    sys.stdout.flush()        #立即将缓存的内容刷新到标准输出
    import time
    time.sleep(0.1)           #设置延迟查看效果

 

第二种(复杂/美观)(推荐):

#!/usr/bin/python3
# -*- coding:utf-8 -*-
 
import sys
import time
from urllib import request
 
 
'''
 urllib.urlretrieve 的回调函数:
def callbackfunc(blocknum, blocksize, totalsize):
    @blocknum:  已经下载的数据块
    @blocksize: 数据块的大小
    @totalsize: 远程文件的大小
'''
 
def Schedule(blocknum, blocksize, totalsize):
    speed = (blocknum * blocksize) / (time.time() - start_time)
    # speed_str = " Speed: %.2f" % speed
    speed_str = " Speed: %s" % format_size(speed)
    recv_size = blocknum * blocksize
     
    # 设置下载进度条
    f = sys.stdout
    pervent = recv_size / totalsize
    percent_str = "%.2f%%" % (pervent * 100)
    n = round(pervent * 50)
    s = ('#' * n).ljust(50, '-')
    f.write(percent_str.ljust(8, ' ') + '[' + s + ']' + speed_str)
    f.flush()
    # time.sleep(0.1)
    f.write('\r')
 
# 字节bytes转化K\M\G
def format_size(bytes):
    try:
        bytes = float(bytes)
        kb = bytes / 1024
    except:
        print("传入的字节格式不对")
        return "Error"
    if kb >= 1024:
        M = kb / 1024
        if M >= 1024:
            G = M / 1024
            return "%.3fG" % (G)
        else:
            return "%.3fM" % (M)
    else:
        return "%.3fK" % (kb)
 
if __name__ == '__main__':
    # print(format_size(1222222222))
    start_time = time.time()
    filename = 'test.data'
    url = 'http://ip:port/path/speed.test'
    request.urlretrieve(url, filename, Schedule)

小提示:第二种注意把time.sleep(0.1)打开,不然看不到下载的时候可能看不到进度条

参考链接:https://yq.aliyun.com/articles/548109

                  https://www.cnblogs.com/standby/p/7384187.html

转载于:https://www.cnblogs.com/fh-fendou/p/10524856.html

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 忘记更新进度条进度条需要在每一次循环迭代后更新,如果忘记更新,进度条将会停止在某一个位置,无法正确反映进度。 2. 进度条过长或过短:进度条需要正确反映任务的进度,如果进度条过长或过短,将无法正确反映任务的进度。 3. 进度条样式不美观:进度条作为用户界面的一部分,需要具备美观性,如果样式不美观,将影响用户体验。 4. 进度条速度过快或过慢:进度条需要根据任务的复杂程度和计算速度来设置速度,如果速度过快或过慢,将影响用户体验。 5. 进度条无法中止:有时候,用户需要中止任务,如果进度条无法中止,将会给用户带来困扰。 6. 进度条无法重新开始:有时候,用户需要重新开始任务,如果进度条无法重新开始,将会给用户带来困扰。 ### 回答2: Python实现文本进度条时,常见的错误有以下几点: 1. 字符串拼接错误:在更新进度条时,使用字符串拼接来更新显示进度的字符串。这种方法会频繁创建新的字符串对象,导致大量的内存开销和性能下降。解决方法是使用字符串格式化或者列表拼接的方式来更新进度条字符串。 2. 进度计算错误:在计算进度条所占比例时,往往会出现计算错误的情况。例如,没有正确计算出当前任务的进度百分比,导致进度条显示不准确。解决方法是要确保通过正确的方式计算出当前任务的进度比例。 3. 更新频率错误:一些初学者在实现文本进度条时,频繁地更新进度条,这会导致屏幕输出过于频繁,给用户的体验造成困扰。解决方法是适度地控制更新的频率,可以使用时间间隔的方式来更新进度条。 4. 转义字符错误:在更新进度条时,在控制台输出时往往使用了转义字符来控制光标的位置。但是有些初学者容易出现转义字符使用错误的情况,导致输出的进度条格式混乱。解决方法是在使用转义字符时要仔细检查是否使用正确。 5. 异步更新错误:在多线程或异步编程中,如果没有正确处理更新进度条的同步问题,会导致多个线程同时更新进度条,造成进度条显示错乱。解决方法是使用线程锁或者其他同步机制来保证进度条的正确显示。 综上所述,Python实现文本进度条时需要注意以上几个常见的错误,以保证进度条的正确显示和良好的用户体验。 ### 回答3: Python实现文本进度条时,常见的错误包括以下几个方面: 1. 输出覆盖:在进度条更新时,如果直接使用print语句输出更新信息,会导致进度条上一行的内容被新的进度条信息覆盖。为了解决这个问题,可以使用'\r'特殊字符回车到行首,再输出新的进度条信息。 2. 进度计算错误:进度条的进度计算错误可能会导致进度条的显示不准确。例如,如果设定的总任务数与实际执行任务数不符,或者进度计算公式有误,导致进度条的百分比不准确。在编代码时,需要确保进度计算的准确性。 3. 进度更新不及时:在某些情况下,进度条的更新可能不及时,导致用户无法即时看到进度变化。这可能是由于代码逻辑问题导致的,例如,程序在更新进度条之前耗时很长,或者进度更新频率过低。要解决这个问题,可以适当调整更新进度条的位置和频率。 4. 进度条长度超出终端宽度:当进度条的长度超过终端宽度时,可能会导致进度条显示不完全或错位。为了解决这个问题,可以通过获取终端宽度的方法来动态调整进度条的长度,以保证正确显示。 5. 多线程并行问题:当使用多线程或并行处理时,可能会导致进度条的更新出现错乱或混乱。这是因为多个线程同时更新进度条时,输出会相互干扰。为了解决这个问题,可以使用线程锁或其他同步机制,确保进度条的更新是有序的,避免线程间的竞争。 在实现文本进度条时,需要注意以上错误,并根据具体情况采取相应的解决方案,从而实现一个稳定、准确、美观的文本进度条
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值