显示进度的脚本?

12

当我的Python脚本处理大文件时,我希望向用户展示进度。

我看到过脚本在shell中以相同的光标位置打印'\', "|', '/'以显示进度。

我该如何在Python中实现这个功能?

7个回答

19

你应该使用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%

12

一个简单的“无限旋转器”实现:

import time
import itertools

for c in itertools.cycle('/-\|'):
    print(c, end = '\r')
    time.sleep(0.2)

非常有趣的优雅示例。循环遍历字符串中的字符。这是您自己编写的还是从其他地方获取的?我问这个是因为我想看更多的示例。 - radj

5

tqdm 是这种情况下更加强大的工具。它具有更好的功能和兼容性。

它易于使用,代码可以很简单:

from tqdm import tqdm
for i in tqdm(range(10000)):
    pass  # or do something else

自定义对于特殊情况也很容易。

以下是仓库中的演示:


2
如果你想自己动手实现,可以按照以下步骤进行:
import sys, time

for i in range(10):
  print ".", # <- no newline
  sys.stdout.flush() #<- makes python print it anyway
  time.sleep(1)

print "done!"

这将每秒打印一个点,然后打印 "done!"。

1

或者在 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!")

0

这段代码对我有效:

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样式显示进度:

enter image description here


0

这只是为了好玩而做的。它显示旋转的进度条和加载文本。就像这样:

|         
\ 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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接