English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python에서 콘솔의 진행 바 기능 구현 코드

진행 상황 바의 가장 큰 문제는 모든 문자가 동일한 행에 있고, 수정할 수 있다는 것입니다.

그러나 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에 대한 신고를 보내면, 이메일을 작성할 때 #을 @으로 변경하십시오. 관련 증거를 제공하고, 사실을 확인하면 이 사이트는 즉시 위반 내용을 제거합니다.

좋아하는 것