我正在尝试使用流式帖子请求从我的在线数据库下载文件,同时提供相关下载进度的准确指示,以便在我的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%?
干杯, 坦率
答案 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()