11

当我的 python 脚本处理一个大文件时,我想向用户显示进度。

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

我怎么能在python中做到这一点?

4

7 回答 7

18

你应该使用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%
于 2012-11-22T22:13:14.710 回答
12

一个简单的“无限微调器”实现:

import time
import itertools

for c in itertools.cycle('/-\|'):
    print(c, end = '\r')
    time.sleep(0.2)
于 2012-11-22T22:32:44.373 回答
5

对于这种情况, tqdm是更强大的一种。它具有更好的特性和可比性。

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

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

对于特殊情况,定制也很容易。

这是来自回购的演示:

于 2017-08-29T04:48:53.913 回答
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!"

这将每秒打印一个点,然后打印“完成!”

于 2012-11-22T22:15:03.910 回答
0

或者通常的直升机(在 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!")
于 2012-11-22T22:21:20.923 回答
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)
于 2012-11-26T18:53:18.373 回答
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 样式显示进度:

在此处输入图像描述

于 2019-02-17T20:01:48.153 回答