상태 표시줄 및 백분율 인쇄 방법
다음과 같은 상태 표시줄을 구현하려면:
[========== ] 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
'programing' 카테고리의 다른 글
세트를 어레이로 변환하는 방법 (0) | 2022.11.01 |
---|---|
내장된 가우스 기능을 사용하지 않고 이미지를 흐리게 하는 방법은 무엇입니까? (0) | 2022.10.30 |
Python에서 datetime.date를 UTC 타임스탬프로 변환하는 중 (0) | 2022.10.30 |
명령줄에서 PHP 스크립트 실행 (0) | 2022.10.30 |
javascript에서 [.slice.call]에 대한 설명 (0) | 2022.10.30 |