47 — 진행 — 터미널 진행 막대
오래 걸리는 일에는 진행 상황이 필요합니다. 진행 막대는 반복이 도는 동안
자라나는 # 한 줄입니다. 새 줄을 출력하는 대신 같은 줄을 다시 그리므로
터미널에 한 줄이 채워지는 모습이 보입니다. 이 가이드는 print와 \r(캐리지
리턴)로 진행 막대를 만듭니다.
단계
print()는 보통 새 줄로 끝나서, 두 번째print는 새 줄로 떨어집니다.end="\r"이 새 줄 대신 캐리지 리턴을 넣는데, 캐리지 리턴은 커서를 같은 줄의 시작으로 보냅니다 — 다음print가 그 위에 덮어씁니다:
실행해 보기 →print("Hello", end="\r") print("World")결국
World만 보입니다. 두 번째 호출이 첫 줄을 덮어썼기 때문입니다.같은 줄 덮어쓰기를
for반복과 자라나는#줄로 반복합니다."#" * i는i개의 해시로 된 문자열입니다 —"#" * 3은"###"입니다:
실행해 보기 →for i in range(1, 11): print("#" * i, end="\r") print()한 번 돌 때마다 해시가 하나 더 긴 줄로 다시 그려져 막대가 왼쪽에서 오른쪽으로 채워집니다. 반복 뒤의 빈
print()는 새 줄로 끝내서 다음 출력이 새 줄에서 시작하게 합니다.막대가 너무 빨리 움직여 보기 어렵습니다.
import time이 시계를 불러오고,time.sleep(0.2)가 한 번마다 0.2초 멈춥니다:
실행해 보기 →import time for i in range(1, 11): print("#" * i, end="\r") time.sleep(0.2) print()전체 프로그램입니다.
progress.ko.nme으로 저장합니다:
실행해 보기 →# progress.ko.nme — 한 줄을 채우는 터미널 진행 막대. # 실행: nme 실행 progress.ko # # # 한 줄이 1개에서 10개로 자랍니다. \r은 줄 시작으로 돌아가 # 긴 줄이 그 자리에 덮어씁니다. time.sleep이 움직임을 보여 줍니다. # 막대가 10단계를 달리고, 마지막 print()가 새 줄로 이동합니다. import time steps = 10 말해 "작업 중..." # 매번 한 줄을 만들어 그 자리에 다시 그립니다. for i in range(1, steps + 1): filled = "#" * i percent = i * 10 print(f"{filled} {percent}%", end="\r") time.sleep(0.2) print() 말해 "완료!"막대에 퍼센트가 붙었습니다:
percent = i * 10이 1단계를10%로, 10단계를100%로 만듭니다.실행합니다:
nme 실행 progress.ko작업 중... ########## 100% 완료!진짜 터미널에서는
# 10%부터########## 100%까지 열 줄이 같은 줄에서 서로를 덮어써 해시 하나씩 채워지는 모습이 보입니다. 출력으로 남는 것은 마지막 꽉 찬 막대뿐입니다.
직접 해보기
반복을 거꾸로 바꿔 보세요: range(10, 0, -1)은 꽉 찬 막대가 해시 하나까지
비워지는 것을 그립니다. 또는 "#"을 "="로 바꿔 다른 글자가 줄을 채우게
해 보세요.
배운 것
print(..., end="\r")이 새 줄을 캐리지 리턴으로 바꿉니다."#" * i가 문자열을 반복합니다 — 반복이 한 줄에 자라나는 막대를 그립니다.import time과time.sleep(0.2)이 단계 사이에 멈춥니다.- 진행 막대는 꽉 찰 때까지 한 줄을 다시 그리는 반복입니다.