특정 C / C ++ 프로그램에서와 같이 Python에서 멋진 콘솔 카운터 중 하나를 어떻게 만들 수 있는지 궁금합니다.
나는 일을하는 루프가 있고 현재 출력은 다음과 같습니다.
Doing thing 0
Doing thing 1
Doing thing 2
...
더 깔끔한 것은 마지막 라인 업데이트 만하는 것입니다.
X things done.
여러 콘솔 프로그램에서 이것을 보았고 파이썬에서 이것을 어떻게 할 것인지 궁금합니다.
답변
쉬운 해결책은 "\r"
줄 바꿈을 추가하지 않고 문자열 앞에 쓰는 것입니다 . 문자열이 짧아지지 않으면 충분합니다 …
sys.stdout.write("\rDoing thing %i" % i)
sys.stdout.flush()
진행률 표시 줄이 약간 더 정교합니다. 이것은 제가 사용하는 것입니다.
def startProgress(title):
global progress_x
sys.stdout.write(title + ": [" + "-"*40 + "]" + chr(8)*41)
sys.stdout.flush()
progress_x = 0
def progress(x):
global progress_x
x = int(x * 40 // 100)
sys.stdout.write("#" * (x - progress_x))
sys.stdout.flush()
progress_x = x
def endProgress():
sys.stdout.write("#" * (40 - progress_x) + "]\n")
sys.stdout.flush()
당신은 호출 startProgress
작업의 설명을 통과 한 후 progress(x)
위치를 x
마지막으로 백분율입니다endProgress()
답변
더 우아한 솔루션은 다음과 같습니다.
def progressBar(current, total, barLength = 20):
percent = float(current) * 100 / total
arrow = '-' * int(percent/100 * barLength - 1) + '>'
spaces = ' ' * (barLength - len(arrow))
print('Progress: [%s%s] %d %%' % (arrow, spaces, percent), end='\r')
이 함수를 value
및로 호출하면 endvalue
결과는
Progress: [-------------> ] 69 %
참고 : 여기에 Python 2.x 버전이 있습니다 .
답변
파이썬 3 에서는 다음과 같이 동일한 행에 인쇄 할 수 있습니다.
print('', end='\r')
최신 업데이트 및 진행 상황을 추적하는 데 특히 유용합니다.
루프의 진행 상황을보고 싶다면 여기에서 tqdm 을 추천 합니다. 현재 반복 및 총 반복을 예상 완료 시간과 함께 진행률 표시 줄로 인쇄합니다. 매우 유용하고 빠릅니다. python2 및 python3에서 작동합니다.
답변
다른 대답이 더 좋을 수도 있지만 여기에 제가하고있는 일이 있습니다. 먼저 백 스페이스 문자를 인쇄하는 progress라는 함수를 만들었습니다.
def progress(x):
out = '%s things done' % x # The output
bs = '\b' * 1000 # The backspace
print bs,
print out,
그런 다음 내 주요 기능의 루프에서 다음과 같이 호출했습니다.
def main():
for x in range(20):
progress(x)
return
이것은 물론 전체 라인을 지울 수 있지만 원하는 것을 정확하게 수행하기 위해 그것을 망칠 수 있습니다. 이 방법을 사용하여 진행률 표시 줄을 만들었습니다.
답변
몇 년 후 (내가 한 것처럼) 우연히 발견 한 사람을 위해 진행률 표시 줄이 감소하고 증가 할 수 있도록 6502의 방법을 약간 조정했습니다. 약간 더 많은 경우에 유용합니다. 훌륭한 도구에 대해 6502에게 감사드립니다!
기본적으로 유일한 차이점은 progress (x)가 호출 될 때마다 #s와 -s의 전체 행이 기록되고 커서는 항상 막대의 시작 부분으로 반환된다는 것입니다.
def startprogress(title):
"""Creates a progress bar 40 chars long on the console
and moves cursor back to beginning with BS character"""
global progress_x
sys.stdout.write(title + ": [" + "-" * 40 + "]" + chr(8) * 41)
sys.stdout.flush()
progress_x = 0
def progress(x):
"""Sets progress bar to a certain percentage x.
Progress is given as whole percentage, i.e. 50% done
is given by x = 50"""
global progress_x
x = int(x * 40 // 100)
sys.stdout.write("#" * x + "-" * (40 - x) + "]" + chr(8) * 41)
sys.stdout.flush()
progress_x = x
def endprogress():
"""End of progress bar;
Write full bar, then move to next line"""
sys.stdout.write("#" * 40 + "]\n")
sys.stdout.flush()
답변
내가 잘 이해했다면 (확실하지 않음) 인쇄 <CR>
하고 싶지 <LR>
않습니까?
가능하다면 콘솔 터미널이이를 허용하는 한 (출력 si가 파일로 리디렉션 될 때 중단됩니다).
from __future__ import print_function
print("count x\r", file=sys.stdout, end=" ")
답변
print()
함수를 보면 sys 라이브러리를 사용하지 않고 할 수 있습니다.
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
내 코드는 다음과 같습니다.
def update(n):
for i in range(n):
print("i:",i,sep='',end="\r",flush=True)
#time.sleep(1)