我写一个小程序下载文件通过HTTP(如,例如,描述在这里).
我还想包含一个小的下载进度指示器,显示下载进度的百分比.
这是我想出的:
sys.stdout.write(rem_file + "...") urllib.urlretrieve(rem_file, loc_file, reporthook=dlProgress) def dlProgress(count, blockSize, totalSize): percent = int(count*blockSize*100/totalSize) sys.stdout.write("%2d%%" % percent) sys.stdout.write("\b\b\b") sys.stdout.flush()
输出:MyFileName ... 9%
还有其他想法或建议吗?
有点烦人的是在百分比的第一位数字中终端闪烁的光标.有办法防止这种情况吗?有没有办法隐藏光标?
编辑:
这里有一个更好的替代方法,在dlProgress和'\ r'代码中使用全局变量作为文件名:
global rem_file # global variable to be used in dlProgress urllib.urlretrieve(rem_file, loc_file, reporthook=dlProgress) def dlProgress(count, blockSize, totalSize): percent = int(count*blockSize*100/totalSize) sys.stdout.write("\r" + rem_file + "...%d%%" % percent) sys.stdout.flush()
输出:MyFileName ... 9%
并且光标显示在行的END处.好多了.
在http://pypi.python.org/pypi/progressbar/2.2上有一个用于python的文本进度条库 ,您可能会发现它很有用:
该库提供文本模式进度条.这通常用于显示长时间运行的进度,提供处理正在进行的视觉线索.
ProgressBar类管理进度,行的格式由许多小部件给出.窗口小部件是可以根据进度状态不同地显示的对象.小部件有三种类型: - 一个字符串,总是显示自己; - ProgressBarWidget,每次调用update方法时都可能返回不同的值; 和 - 一个ProgressBarWidgetHFill,它类似于ProgressBarWidget,但它会扩展以填充该行的剩余宽度.
进度条模块非常易于使用,但功能非常强大.并自动支持自动调整大小等功能.
您也可以尝试:
sys.stdout.write("\r%2d%%" % percent) sys.stdout.flush()
在字符串的开头使用单个回车而不是几个退格.你的光标仍会闪烁,但它会在百分号后闪烁,而不是在第一个数字下面闪烁,并且使用一个控制字符而不是三个控制字符可能会减少闪烁.
对于它的价值,这是我用来使其工作的代码:
from urllib import urlretrieve from progressbar import ProgressBar, Percentage, Bar url = "http://......." fileName = "file" pbar = ProgressBar(widgets=[Percentage(), Bar()]) urlretrieve(url, fileName, reporthook=dlProgress) def dlProgress(count, blockSize, totalSize): pbar.update( int(count * blockSize * 100 / totalSize) )