programing

상태 표시줄 및 백분율 인쇄 방법

goodsources 2022. 10. 30. 11:16
반응형

상태 표시줄 및 백분율 인쇄 방법

다음과 같은 상태 표시줄을 구현하려면:

[==========                ]  45%
[================          ]  60%
[==========================] 100%

이것을 다른 행으로 인쇄하지 않고, 계속 갱신해 주었으면 합니다.이거 어떻게 하는 거야?

'\r'charactercharacter('문자')에 수 .

from time import sleep
import sys

for i in range(21):
    sys.stdout.write('\r')
    # the exact output you're looking for:
    sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
    sys.stdout.flush()
    sleep(0.25)

모든 시스템에서 완벽하게 휴대할 수 있을지는 모르겠지만 적어도 Linux와 OSX에서는 동작합니다.

PyPI에서 얻을 수 있는 Python 모듈이 있습니다.이 모듈에는 이러한 기능이 구현되어 있습니다.종속성을 추가하는 것이 문제가 되지 않는다면, 좋은 해결책입니다.그렇지 않으면 다른 답변 중 하나를 선택합니다.

사용 방법의 간단한 예를 다음에 나타냅니다.

import progressbar
from time import sleep
bar = progressbar.ProgressBar(maxval=20, \
    widgets=[progressbar.Bar('=', '[', ']'), ' ', progressbar.Percentage()])
bar.start()
for i in xrange(20):
    bar.update(i+1)
    sleep(0.1)
bar.finish()

, 를용사설 to to to to to to to to to to to to to to to to to 。easy_install progressbar , 「」pip install progressbar핍을 원하신다면요

도움이 되는 라이브러리 tqdm(https://github.com/tqdm/tqdm/,)을 찾았습니다.자동으로 완료 시간을 예측하여 반복기로 사용할 수 있습니다.

사용방법:

import tqdm
import time

for i in tqdm.tqdm(range(1000)):
    time.sleep(0.01)
    # or other long operations

결과:

|####------| 450/1000  45% [elapsed: 00:04 left: 00:05, 99.15 iters/sec]

tqdm어떤 반복도 가능합니다.

하시면 됩니다.\r(반환).데모:

import sys
total = 10000000
point = total / 100
increment = total / 20
for i in xrange(total):
    if(i % (5 * point) == 0):
        sys.stdout.write("\r[" + "=" * (i / increment) +  " " * ((total - i)/ increment) + "]" +  str(i / point) + "%")
        sys.stdout.flush()

여기서는 다음 코드를 함수로 사용할 수 있습니다.

def drawProgressBar(percent, barLen = 20):
    sys.stdout.write("\r")
    progress = ""
    for i in range(barLen):
        if i < int(barLen * percent):
            progress += "="
        else:
            progress += " "
    sys.stdout.write("[ %s ] %.2f%%" % (progress, percent * 100))
    sys.stdout.flush()

.format 사용 시:

def drawProgressBar(percent, barLen = 20):
    # percent float from 0 to 1. 
    sys.stdout.write("\r")
    sys.stdout.write("[{:<{}}] {:.0f}%".format("=" * int(barLen * percent), barLen, percent * 100))
    sys.stdout.flush()

은 내장된 "" " " " " 을 사용하여 사용해 .sys:

import sys

def print_progress_bar(index, total, label):
    n_bar = 50  # Progress bar width
    progress = index / total
    sys.stdout.write('\r')
    sys.stdout.write(f"[{'=' * int(n_bar * progress):{n_bar}s}] {int(100 * progress)}%  {label}")
    sys.stdout.flush()

사용방법:

foo_list = ["a", "b", "c", "d"]
total = len(foo_list)

for index, item in enumerate(foo_list):
    print_progress_bar(index, total, "foo bar")
    sleep(0.5)

enumerate(foo_list)그럼 루프 중에 인덱스 값에 액세스할 수 있습니다.

출력:

[================================================  ] 96%  foo bar  

여기에 이미지 설명 입력

게시된 답변 중 어느 것도 제 요구를 완전히 충족시키지 못했습니다.그래서 나는 위와 같이 내 것을 썼다.필요한 기능:

  • 스텝 번호와 총 스텝 수만 통과하면 퍼센티지를 계산하는 어려운 작업이 완료됩니다.
  • 60자를 사용하여 480개의 "틱"으로 나누어 틱당 0.21%를 산출합니다.눈금이 없으면 각 문자는 1.67%에 불과합니다.
  • 제목 추가 지원.
  • 행의 마지막에 완료되는 비율(옵션).
  • 기본 60자 또는 480 "틱"으로 설정된 가변 길이 진행 표시줄입니다.
  • 진행률 표시줄 색상을 설정합니다. 기본값은 녹색입니다.

프로그레스 디스플레이를 호출하는 방법

진행 상황 표시를 호출하는 것은 매우 간단합니다. 샘플의 ..gif함수는 다음을 사용하여 호출되었습니다.

percent_complete(step, total_steps, title="Convert Markdown")

total_steps약 이었습니다.len(rows)CSV 교환step【Exchange Markdown Q&A】Kramdown (GitHub 페이지)으로 변환되었을 때의 현재 행 번호입니다.

Python 코드

코드는 간단하지만 다른 응답보다 약간 길다.

def percent_complete(step, total_steps, bar_width=60, title="", print_perc=True):
    import sys

    # UTF-8 left blocks: 1, 1/8, 1/4, 3/8, 1/2, 5/8, 3/4, 7/8
    utf_8s = ["█", "▏", "▎", "▍", "▌", "▋", "▊", "█"]
    perc = 100 * float(step) / float(total_steps)
    max_ticks = bar_width * 8
    num_ticks = int(round(perc / 100 * max_ticks))
    full_ticks = num_ticks / 8      # Number of full blocks
    part_ticks = num_ticks % 8      # Size of partial block (array index)
    
    disp = bar = ""                 # Blank out variables
    bar += utf_8s[0] * int(full_ticks)  # Add full blocks into Progress Bar
    
    # If part_ticks is zero, then no partial block, else append part char
    if part_ticks > 0:
        bar += utf_8s[part_ticks]
    
    # Pad Progress Bar with fill character
    bar += "▒" * int((max_ticks/8 - float(num_ticks)/8.0))
    
    if len(title) > 0:
        disp = title + ": "         # Optional title to progress display
    
    # Print progress bar in green: https://stackoverflow.com/a/21786287/6929343
    disp += "\x1b[0;32m"            # Color Green
    disp += bar                     # Progress bar to progress display
    disp += "\x1b[0m"               # Color Reset
    if print_perc:
        # If requested, append percentage complete to progress display
        if perc > 100.0:
            perc = 100.0            # Fix "100.04 %" rounding error
        disp += " {:6.2f}".format(perc) + " %"
    
    # Output to terminal repetitively over the same line using '\r'.
    sys.stdout.write("\r" + disp)
    sys.stdout.flush()

Python 코드 노트

몇 가지 포인트:

  • [ .... ]같은 목적을 가진 채우기 문자가 있기 때문에 질문의 괄호 자리 표시자 요건은 필요하지 않습니다.이렇게 하면 진행률 표시줄이 넓어지기 위해 두 문자가 더 절약됩니다.
  • bar_width키워드 파라미터는 화면 폭에 따라 사용할 수 있습니다.의 「」는 다음과 같습니다.60이치노
  • print_perc=True는 "Default"를 수 .print_perc=False함수를 호출할 때 사용합니다.이치노
  • title=""키워드 파라미터는 기본적으로 제목이 없습니다. 유스 원 유스 원 유스 원 유스 원 유스를 원하십니까?title="My Title" ★★★★★★★★★★★★★★★★★」: 자동으로 추가됩니다.
  • 되면 잊지 하십시오.sys.stdout.write("\r")에 어 followed가 붙는다.sys.stdout.flush()진행 표시 행을 지웁니다.

요약

이 답변은 다른 답변보다 조금 길지만 코드를 추가해야 하는 솔루션의 일부가 아니라 완전한 솔루션임을 유의해야 합니다.

또 다른 포인트는 이 솔루션에는 종속성이 없으며 추가로 설치할 필요가 없다는 것입니다. 및 UTF-8에서 됩니다.gnome-terminal추가 셋업은 필요 없습니다.2. Python 2.7이 필요할 수 .# -*- coding: utf-8 -*-의 두 IE를 사용하다

할 수 .init,update,pause 정보를 화면에 ), (디버깅 정보를 에 인쇄하는 경우),resume ★★★★★★★★★★★★★★★★★」close★★★★★★★★★★★★★★★★★★.

이 함수는 bash 스크립트에서 변환되었습니다.

는 sony 을 bash "Sony TV"로 합니다.libnotify-bin을 사용하다바에 이 있는 linkbash를 하십시오.

2022년 1월 30일 편집

  • 문자당 4눈금을 8눈금으로 변경하세요.
  • 전체 블록 사이의 끊기를 제거합니다.
  • 색 지원을 추가합니다.

위의 답변과 CLI 프로그레스바에 관한 기타 유사한 질문을 바탕으로 모든 질문에 대한 일반적인 답변을 얻었다고 생각합니다.https://stackoverflow.com/a/15860757/2254146 에서 확인하세요.

다음은 기능의 복사본입니다. 단, 사용자의 스타일에 맞게 수정되었습니다.

import time, sys

# update_progress() : Displays or updates a console progress bar
## Accepts a float between 0 and 1. Any int will be converted to a float.
## A value under 0 represents a 'halt'.
## A value at 1 or bigger represents 100%
def update_progress(progress):
    barLength = 20 # Modify this to change the length of the progress bar
    status = ""
    if isinstance(progress, int):
        progress = float(progress)
    if not isinstance(progress, float):
        progress = 0
        status = "error: progress var must be float\r\n"
    if progress < 0:
        progress = 0
        status = "Halt...\r\n"
    if progress >= 1:
        progress = 1
        status = "Done...\r\n"
    block = int(round(barLength*progress))
    text = "\rPercent: [{0}] {1}% {2}".format( "="*block + " "*(barLength-block), progress*100, status)
    sys.stdout.write(text)
    sys.stdout.flush()

처럼 보인다

백분율: [====================] 99.0%

라인 는, 「 라인 」click아주 좋은 소식입니다.

import click
import time

for filename in range(3):
    with click.progressbar(range(100), fill_char='=', empty_char=' ') as bar:
        for user in bar:
            time.sleep(0.01)

출력은 다음과 같습니다.

$ python test.py
  [====================================]  100%
  [====================================]  100%
  [=========                           ]   27%

Mark Rushakoff의 솔루션에서 설명한 바와 같이 캐리지 리턴 문자를 출력할 수 있습니다.sys.stdout.write('\r')커서를 줄의 선두로 리셋합니다.Python 3의 f-String을 구현하면서 이 솔루션을 일반화하려면

from time import sleep
import sys

n_bar = 50
iterable = range(33)  # for demo purposes
n_iter = len(iterable)
for i, item in enumerate(iterable):
    j = (i + 1) / n_iter

    sys.stdout.write('\r')
    sys.stdout.write(f"[{'=' * int(n_bar * j):{n_bar}s}] {int(100 * j)}%")
    sys.stdout.flush()

    sleep(0.05)  
    # do something with <item> here
def printProgressBar(value,label):
    n_bar = 40 #size of progress bar
    max = 100
    j= value/max
    sys.stdout.write('\r')
    bar = '█' * int(n_bar * j)
    bar = bar + '-' * int(n_bar * (1-j))

    sys.stdout.write(f"{label.ljust(10)} | [{bar:{n_bar}s}] {int(100 * j)}% ")
    sys.stdout.flush()

호출:

printProgressBar(30,"IP")

IP | [ ]30 %

오늘 우연히 이 스레드를 발견했는데 Mark Rushakoff에서 이 솔루션을 테스트한 후

from time import sleep
import sys

for i in range(21):
sys.stdout.write('\r')
# the exact output you're looking for:
sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
sys.stdout.flush()
sleep(0.25)

Python 3.4.3 64비트를 탑재한 W7-64에서는 정상적으로 동작하지만 네이티브 콘솔에서만 동작합니다.단, spyder 3.0.0dev의 내장 콘솔을 사용하는 경우 회선 끊김이 아직 존재하거나 다시 발생합니다.이것을 알아내는 데 시간이 걸리기 때문에, 여기서 이 관찰을 보고하고 싶습니다.

가장 쉬운 것은 아직

import sys
total_records = 1000
for i in range (total_records):
    sys.stdout.write('\rUpdated record: ' + str(i) + ' of ' + str(total_records))
    sys.stdout.flush()

중요한 것은 정수형을 문자열로 변환하는 것입니다.

시스템 호출을 하지 않고 순수하게 python이 되려면:

from time import sleep

for i in range(21):
    spaces = " " * (20 - i)
    percentage = 5*i
    print(f"\r[{'='*i}{spaces}]{percentage}%", flush=True, end="")
    sleep(0.25)

여기와 그 밖의 몇 가지 답을 바탕으로 진행률 표시줄과 경과/추정 남은 시간을 표시하는 간단한 함수를 작성했습니다.대부분의 Unix 기반 머신에서 동작합니다.

import time
import sys

percent = 50.0
start = time.time()
draw_progress_bar(percent, start)


def draw_progress_bar(percent, start, barLen=20):
sys.stdout.write("\r")
progress = ""
for i in range(barLen):
    if i < int(barLen * percent):
        progress += "="
    else:
        progress += " "

elapsedTime = time.time() - start;
estimatedRemaining = int(elapsedTime * (1.0/percent) - elapsedTime)

if (percent == 1.0):
    sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: Done!\n" % 
        (progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60))
    sys.stdout.flush()
    return
else:
    sys.stdout.write("[ %s ] %.1f%% Elapsed: %im %02is ETA: %im%02is " % 
        (progress, percent * 100, int(elapsedTime)/60, int(elapsedTime)%60,
         estimatedRemaining/60, estimatedRemaining%60))
    sys.stdout.flush()
    return

이것은 어떤 루프에서도 사용할 수 있는 매우 간단한 접근법입니다.

#!/usr/bin/python
for i in range(100001):
    s =  ((i/5000)*'#')+str(i)+(' %')
    print ('\r'+s),

@Mark-Rushakoff 답변을 사용하여 시스템 라이브러리를 호출할 필요가 없는 보다 간단한 방법을 알아냈습니다.Python 3에서 동작합니다.Windows에서 테스트 완료:

from time import sleep
for i in range(21):
    # the exact output you're looking for:
    print ("\r[%-20s] %d%%" % ('='*i, 5*i), end='')
    sleep(0.25)

PyProg를 사용해 보세요.PyProg는 Python용 오픈 소스 라이브러리이며, 커스터마이즈 가능한 슈퍼 프로그레스 인디케이터와 바를 만듭니다.

현재 버전 1.0.2로 Github에서 호스팅되며 PyPI에서 사용할 수 있습니다(아래 링크).Python 3 & 2와 호환되며 Qt Console에서도 사용할 수 있습니다.

정말 사용하기 편해요.다음 코드:

import pyprog
from time import sleep

# Create Object
prog = pyprog.ProgressBar(" ", " ", total=34, bar_length=26, complete_symbol="=", not_complete_symbol=" ", wrap_bar_prefix=" [", wrap_bar_suffix="] ", progress_explain="", progress_loc=pyprog.ProgressBar.PROGRESS_LOC_END)
# Update Progress Bar
prog.update()

for i in range(34):
    # Do something
    sleep(0.1)
    # Set current status
    prog.set_stat(i + 1)
    # Update Progress Bar again
    prog.update()

# Make the Progress Bar final
prog.end()

원하는 대로 만들 수 있습니다(바 길이도 가능).

[===========               ] 45%
[===============           ] 60%
[==========================] 100%

프로그레스 바를 커스터마이즈 하는 옵션에 대해서는, 이 Web 사이트의 Github 페이지를 참조해 주세요.

심플하지만 커스터마이즈 가능한 프로그레스바 라이브러리가 필요했기 때문에 실제로 PyProg를 만들었습니다.과 같습니다.pip install pyprog.

PyProg Github : https://github.com/Bill13579/pyprog
PyPI: https://pypi.python.org/pypi/pyprog/

다음은 @Mark-Rushakoff의 솔루션을 사용하여 작성한 것입니다.단자 폭에 적응적으로 조정하기 위해.

from time import sleep
import os
import sys
from math import ceil

l = list(map(int,os.popen('stty size','r').read().split()))
col = l[1]
col = col - 6

for i in range(col):
    sys.stdout.write('\r')
    getStr = "[%s " % ('='*i)
    sys.stdout.write(getStr.ljust(col)+"]"+"%d%%" % (ceil((100/col)*i)))
    sys.stdout.flush()
    sleep(0.25)
print("")

스티븐 C에 따르면마크 러샤코프의 답변에 대한 하웰의 코멘트

j = (i + 1) / n
stdout.write('\r')
stdout.write('[%-20s] %d%%' % ('='*int(20*j), 100*j))
stdout.flush()

서 ''는i은 현재 항목이고, 이 항목은 이 항목입니다.n.

Python 3.6의 경우 출력을 인라인으로 업데이트하기 위해 다음 작업을 수행합니다.

for current_epoch in range(10):
    for current_step) in range(100):
        print("Train epoch %s: Step %s" % (current_epoch, current_step), end="\r")
print()
import progressbar
import time

# Function to create  
def animated_marker():
    widgets = ['Loading: ', progressbar.Bar('=', '[', ']', '-'), progressbar.Percentage()]
    bar = progressbar.ProgressBar(max_value=200,widgets=widgets).start() 
      
    for i in range(200): 
        time.sleep(0.1)
        bar.update(i+1)
    bar.finish()

# Driver's code 
animated_marker()

언급URL : https://stackoverflow.com/questions/3002085/how-to-print-out-status-bar-and-percentage

반응형