当我的 python 脚本处理一个大文件时,我想向用户显示进度。
我已经'\', "|', '/'
在 shell 中的相同光标位置看到脚本打印以显示进度。
我怎么能在python中做到这一点?
当我的 python 脚本处理一个大文件时,我想向用户显示进度。
我已经'\', "|', '/'
在 shell 中的相同光标位置看到脚本打印以显示进度。
我怎么能在python中做到这一点?
你应该使用python-progressbar
使用起来很简单:
import progressbar as pb
progress = pb.ProgressBar(widgets=_widgets, maxval = 500000).start()
progvar = 0
for i in range(500000):
# Your code here
progress.update(progvar + 1)
progvar += 1
这将显示一个进度条,如:
Progress: |#################################################### |70%
一个简单的“无限微调器”实现:
import time
import itertools
for c in itertools.cycle('/-\|'):
print(c, end = '\r')
time.sleep(0.2)
对于这种情况, tqdm是更强大的一种。它具有更好的特性和可比性。
它易于使用,代码可以简单为:
from tqdm import tqdm
for i in tqdm(range(10000)):
pass # or do something else
对于特殊情况,定制也很容易。
这是来自回购的演示:
如果你想自己动手,你可以这样做:
import sys, time
for i in range(10):
print ".", # <- no newline
sys.stdout.flush() #<- makes python print it anyway
time.sleep(1)
print "done!"
这将每秒打印一个点,然后打印“完成!”
或者通常的直升机(在 Python 3 中):
import sys, time
for i in range(10):
print("/-\|"[i % 4], end="\b")
sys.stdout.flush() #<- makes python print it anyway
time.sleep(0.1)
print("\ndone!")
做这个是为了好玩。它显示旋转条和文本加载。像这样:
|
\ l
- lo
/ loa
| load
\ loadi
- loadin
/ loading
该代码在 Windows 上进行了测试。
'''
Spinner and a text showing loading.
'''
import sys
import time
def looper(text):
sys.stdout.write('\r')
sys.stdout.write(text)
sys.stdout.flush()
spinner = ["|", "\\" , "-", "/" ]
loading = ['l','o','a','d','i','n','g']
spin_1 = len(spinner)
spin_2 = len(loading) + 1
print("Starting program...")
for x in range(100):
spin_2mod = x%spin_2
looper(spinner[x%spin_1] + " " + "".join(loading[0: (spin_2mod) ]) + (" " * (spin_2 - spin_2mod)))
time.sleep(0.5)
print("\nExiting program...")
time.sleep(2)
这段代码对我有用:
class ProgressBar(object):
def __init__(self, maxval=100):
self.currval = 0
self.maxval = int(maxval)
self.last_progress = 0
sys.stdout.write("0")
sys.stdout.flush()
def next(self, val = None):
if val:
self.currval = val
else:
self.currval = self.currval + 1
progress = round(20 * self.currval / self.maxval)
while self.last_progress < progress:
self.last_progress = self.last_progress + 1
self._print_progress(self.last_progress)
def finish(self):
while self.last_progress < 20:
self.last_progress = self.last_progress + 1
self._print_progress(self.last_progress)
sys.stdout.write("\n")
sys.stdout.flush()
def _print_progress(self, progress):
if progress % 5 == 0:
percent = int(progress * 5)
sys.stdout.write(str(percent))
else:
sys.stdout.write(".")
sys.stdout.flush()
此代码适用于数亿次的大量迭代 - 它不会在每次迭代时重绘控制台。
使用示例:
progress = ProgressBar(band.YSize)
for y in xrange(0, band.YSize, 256):
array = band.ReadAsArray(x, y, 256, 256)
map_array_values(array, values)
progress.next(y)
del array
progress.finish()
它将以 GDAL 样式显示进度: