Script, чтобы показать прогресс?

Я хотел бы показать прогресс пользователю, когда мой python script обрабатывает большой файл.

Я видел script распечатки '\', "|', '/' в той же позиции курсора в оболочке, чтобы показать прогресс.

Как я могу сделать это в python?

Ответ 1

Простая реализация "бесконечного прядильника":

import sys
import time
import itertools

for c in itertools.cycle('/-\|'):
    sys.stdout.write('\r' + c)
    sys.stdout.flush()
    time.sleep(0.2)

Ответ 2

Вы должны использовать 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%

Ответ 3

Если вы хотите перевернуть свой собственный, вы можете сделать что-то вроде этого:

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!"

Ответ 4

tqdm является более мощным для этого случая. он имеет лучшие возможности и сопоставимость.

он прост в использовании, код может быть простым:

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

настройка также легко для особых случаев.

Вот демон с репо:

Ответ 5

Или обычный вертолет (в 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!")

Ответ 6

Сделал это для удовольствия. Он показывает вращающуюся полосу и загрузку текста. Вот так:

|         
\ l       
- lo      
/ loa     
| load    
\ loadi   
- loadin  
/ loading 

Код был протестирован на окнах.

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