如何预测准确计算流媒体下载过程中的进度

时间:2017-01-12 05:12:09

标签: python qt progress-bar python-requests

我正在尝试使用流式帖子请求从我的在线数据库下载文件,同时提供相关下载进度的准确指示,以便在我的QT应用程序中启动进度条。

我认为我可以简单地将chunk_size * chunk金额与文件大小进行比较,以了解我已下载了多少相关数据,但它似乎并没有那样工作。 为了测试我对块的理解,我将chunk_size设置为与文件大小相同(约9.8MB)。这是我的测试代码:

with closing(requests.post(ipAddress,
                           headers={'host':hostURL},
                           data=dataDict,
                           timeout=timeout,
                           stream=True)) as responseObject:
    chunkNumber = 0
    for chunk in responseObject.iter_content(chunk_size=10276044):
        print chunkNumber
        chunkNumber += 1
        content += chunk

我希望只看到一两个块,但是当我多次运行测试时,我看到chunkNumber增加到1600到4000之间的任何地方。

我显然误解了chunk_size的使用,所以我的问题是: 如何在iter_content()循环期间准确确定下载的相对进度,以便我可以将进度条从0开到100%?

干杯, 坦率

1 个答案:

答案 0 :(得分:0)

我为自己的项目找到的解决方案是找到响应的长度并除以100

这是Python 3代码,只需从打印语句中删除括号即可与2兼容。

f = open(title, 'wb')
response = requests.get(url, params=query, headers=HDR, stream=True)
size = int(response.headers.get('content-length'))
CHUNK = size//100 # size for a percentage point
if CHUNK > 1000000: # place chunk cap on >1MB files
    CHUNK = 100000 # 0.1MB
print(size, 'bytes')
print("Writing to file in chunks of {} bytes...".format(CHUNK))
actual = 0 # current progress
try:
    for chunk in response.iter_content(chunk_size=CHUNK):
        if not chunk: break
        f.write(chunk)
        actual += len(chunk) # move progress bar
        percent = int((actual/size)*100)
        if 'idlelib' in sys.modules: # you can take these conditions out if you don't have windows
        #if you do then import sys, os at the start of the program
            if not(percent % 5):
                print('{}%'.format(percent), end=' ')
        else:
            os.system('title {}% {}/{}'.format(percent, actual, size))
except Exception as e:
    print(e)
finally:
    f.close()