English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
진행 상황 바의 가장 큰 문제는 모든 문자가 동일한 행에 있고, 수정할 수 있다는 것입니다.
그러나 print 문구를 실행할 때, 파이썬은 문구를 출력한 후에도 끝에 '\n'을 추가하여 줄 바꿈을 합니다. 이는 터미널에서 print 이후에 수정할 수 없게 됩니다. 따라서 우리의 출력은 더 이상 print을 사용할 수 없습니다.
우리가 사용하는 것은 sys 라이브러리의 sys.stdout.write() 함수로, 이 함수는 컨솔에서 이 문자열을 출력하면서 끝나지 않는다는 의미이며, 이는 출력이 완전히 끝나지 않았다는 것을 의미합니다. sys.stdout.flush() 함수를 사용하여 출력을 일시적으로 컨솔에 출력할 수 있습니다(이를 가상 출력으로 부르겠습니다). 그렇다면 'r' 이스케이프 문자를 사용하면 모든 것이 합리적이게 보일 것입니다.
다른 말로 하면: 문자열을 출력할 때 '\n'을 추가하지 않고, 커서를 행의 시작으로 돌리고 현재 버퍼를 표시하면, 그것이 print과 같이 보이지만, 이 때 커서는 원래 위치에 남습니다.
예제
[시험 결과, Linux 터미널에서만 효과가 있으며, pycharm에서 디버깅 출력은 효과가 없습니다]
import sys, time for i in range(5) sys.stdout.write('HELLO: %05d' % i) sys.stdout.flush() time.sleep(1)
터미널에서 이 코드를 실행하면 간단한 진행 상황 바 효과를 얻을 수 있습니다.
다음으로 해결해야 할 두 가지 문제가 있습니다:
1: 버퍼를 비우기
애초에 지혜로운 독자들은 새로운 문자열이 이전 문자열보다 짧을 때 문제가 발생할 수 있다는 것을 발견할 수 있습니다. 예를 들어 다음과 같은 코드:
import sys, time for i in range(5) sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
실행 후 결과는 기대와 다를 수 있습니다.
실제로는 이미 flush된 문자는 자동으로 지우지 않기 때문에, 새로 입력된 것이만 수정됩니다. 이 점을 고려하여 현재의 솔루션은 이전 문자열을 채우기 위해 공백을 출력한 후 다시 작성하는 것입니다:
import sys, time for i in range(5) sys.stdout.write(' ') * 10 + '\r') sys.stdout.flush() sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
2: 고정 바닥 출력
때때로 진행 상황 바가 로드되는 동안 추가적인 출력이 필요할 수 있습니다.
우리는 이전 출력을 갱신한 후 필요한 문자열을 출력하고 가상의 진행 상황 바를 출력하는 것을 시도해 보겠습니다.
다음과 같은 코드를 사용합니다:
import sys, time for i in range(5) sys.stdout.write(' ') * 10 + '\r') sys.stdout.flush() print i sys.stdout.write(str(i) * (5 - i) + '\r') sys.stdout.flush() time.sleep(1)
그런 다음 필요한 작업을 완료할 수 있습니다.
그렇다면, 원리는 매우 간단하지 않습니까?
여기서는 직접 구현한 클래스를 사용하여 진행 상황 바를 출력하는 예제를 제공합니다:
import sys, time class ProgressBar: def __init__(self, count = 0, total = 0, width = 50): self.count = count self.total = total self.width = width def move(self): self.count += 1 def log(self, s): sys.stdout.write(' ') * (self.width + 9) + '\r') sys.stdout.flush() print s progress = self.width * self.count / self.total sys.stdout.write('{0:3}/{1:3}: '.format(self.count, self.total)) sys.stdout.write('#' * progress + '-' * (self.width - progress) + '\r') if progress == self.width: sys.stdout.write('\n') sys.stdout.flush() bar = ProgressBar(total = 10) for i in range(10) bar.move() bar.log('We have arrived at: ' + str(i + 1)) time.sleep(1)
효과는 다음과 같습니다:
이렇게 되면, 몇 가지 작업에서 프로그램 실행의 진행 상황을 쉽게 확인할 수 있습니다. 예를 들어, 스파이더, 기계 학습 등 얼마나 많은 시간이 걸릴지 모르는 작업도 시각적으로 시간을 제어할 수 있습니다.
이제 Python에서 컨솔에서 진행 상황을 표시하는 코드를 모두 공유했습니다. 여러분에게 참고가 되길 바라며, 강의를 많이 지지해 주시길 바랍니다.
공지: 이 글의 내용은 인터넷에서 가져왔으며, 저작권자가 모두 소유하고 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임을 부담하지 않습니다. 저작권 위반이 의심되는 내용을 발견하면 notice#w로 이메일을 보내 주세요.3codebox.com에 대한 신고를 보내면, 이메일을 작성할 때 #을 @으로 변경하십시오. 관련 증거를 제공하고, 사실을 확인하면 이 사이트는 즉시 위반 내용을 제거합니다.