파이썬에서 새 줄이 아닌 동일한 줄로 인쇄하십시오.


85

기본적으로 나는이 남자가 한 것과는 반대로하고 싶다 ... 헤헤.

Python 스크립트 : 기존 줄을 업데이트하는 대신 셸에 매번 새 줄을 인쇄합니다.

얼마나 멀리 있는지 알려주는 프로그램이 있습니다.

for i in some_list:
    #do a bunch of stuff.
    print i/len(some_list)*100," percent complete"

따라서 len (some_list)가 50이면 마지막 줄이 50 번 인쇄됩니다. 한 줄을 인쇄하고 그 줄을 계속 업데이트하고 싶습니다. 나는 이것이 아마도 당신이 하루 종일 읽을 가장 얄팍한 질문이라는 것을 알고 있습니다. 답을 얻기 위해 Google에 입력해야하는 네 단어를 알아낼 수 없습니다.

최신 정보! 나는 올바른 SEEMED mvds의 제안을 시도했습니다. 새로운 코드

print percent_complete,"           \r",

완료율은 문자열 일뿐입니다 (이제 처음으로 추상화하고 문자 그대로 되려고합니다). 그 결과 이제 프로그램을 실행하고 프로그램이 끝날 때까지 아무것도 인쇄하지 않고 한 줄에만 "100 % 완료"를 인쇄합니다.

캐리지 리턴이 없으면 (하지만 쉼표와 함께 mvds 제안의 절반) 끝까지 아무것도 인쇄하지 않습니다. 그리고 다음을 인쇄합니다.

0 percent complete     2 percent complete     3 percent complete     4 percent complete    

등등. 이제 새로운 문제는 쉼표를 사용하면 프로그램이 끝날 때까지 인쇄되지 않는다는 것입니다.

캐리지 리턴이 있고 쉼표가 없으면 둘 다와 똑같이 작동합니다.


sys.stdout.isatty()터미널에서 실행되지 않을 때 이러한 것들을 뱉어 내지 않도록 확인하고 싶을 수도 있습니다 .
mvds 2010-08-05

나는 이것을 터미널에서 실행하고있다. 그래도 좋은 생각이다. 나는 언젠가는 그것을 필요로 할 것이라고 확신합니다.
chriscauley 2010 년

1
배경은 btw, 여러 언어에서 \ n (지금 생략)이 stdout에 플러시하는 암시 적 신호 역할을한다는 것입니다. 그렇지 않으면 많은 사람들이 혼란 스러울 것입니다.
mvds 2010 년

답변:


85

캐리지 리턴이라고합니다. \r

사용하다

print i/len(some_list)*100," percent complete         \r",

쉼표는 인쇄가 개행을 추가하는 것을 방지합니다. (그리고 공백은 이전 출력에서 ​​줄을 명확하게 유지합니다)

또한, print ""적어도 마무리 개행을 얻으려면 a 로 종료하는 것을 잊지 마십시오 !


12
항상 같은 양의 데이터 (또는 이전 인쇄보다 더 많은 양)를 라인에 인쇄하고 있는지 확인하십시오. 그렇지 않으면 끝 부분이 엉망이 될 것입니다.
Nicholas Knight

너무 가까이 ...이 결과로 질문을 업데이트하겠습니다.
chriscauley 2010 년

2
@dustynachos : 헤, 그 주름을 잊어 버렸습니다. Python 출력 버퍼링 질문 참조 : stackoverflow.com/questions/107705/python-output-buffering
Nicholas Knight

1
@dustynachos : (또는 각 인쇄 호출 후에 sys.stdout.flush ()를 사용하십시오. 나머지 프로그램에 대한 출력 버퍼링에 관심이 없다면 실제로 더 좋을 수 있습니다.)
Nicholas Knight

2
이것은 나를 위해 작동하지 않습니다. 나는 실제로 이것을 여러 번 시도했지만 결코 효과가 없었습니다. 나는 Mac에서 iterm2를 사용하고 있지만 대부분의 경우 Linux 서버에 ssh'd입니다. 실제로 작동하는 방법을 찾지 못했습니다.
bgenchel

35

저에게 효과가 있었던 것은 Remi와 siriusd의 답변의 조합이었습니다.

from __future__ import print_function
import sys

print(str, end='\r')
sys.stdout.flush()

33

Python 3.x에서 다음을 수행 할 수 있습니다.

print('bla bla', end='')

( from __future__ import print_function스크립트 / 모듈 상단 에 배치 하여 Python 2.6 또는 2.7에서도 사용할 수 있음 )

Python 콘솔 진행률 표시 줄 예 :

import time

# status generator
def range_with_status(total):
    """ iterate from 0 to total and show progress in console """
    n=0
    while n<total:
        done = '#'*(n+1)
        todo = '-'*(total-n-1)
        s = '<{0}>'.format(done+todo)
        if not todo:
            s+='\n'        
        if n>0:
            s = '\r'+s
        print(s, end='')
        yield n
        n+=1

# example for use of status generator
for i in range_with_status(10):
    time.sleep(0.1)

\ r도 새 줄을 추가하는 것으로 보입니다
fccoelho

2
이것은 개행 문자를 제거하지만, 저자가 원하는대로 덮어 쓰기를 허용하지 않습니다.
bgenchel

1
@bgenchel이 '\ r'(코드 샘플에서와 같이)와 함께 사용하면 OP가 원하는 것을 정확히 수행합니다
Milo Wielondek

19

Python 3.3 이상에서는 sys.stdout.flush(). print(string, end='', flush=True)공장.

그래서

print('foo', end='')
print('\rbar', end='', flush=True)

'foo'를 'bar'로 덮어 씁니다.


2
인쇄 된 텍스트가 "\r".
bli

13

콘솔의 경우 아마도 필요할 것입니다.

sys.stdout.flush()

강제로 업데이트합니다. ,인쇄에서 사용 하면 stdout이 플러시되는 것을 차단하고 어떻게 든 업데이트하지 않을 것이라고 생각합니다.


터미네이터는 print ( "...", end = '\ r')를 사용했을 때 매 30 초마다 줄을 새로 고쳤습니다. 감사합니다
Bryce Guinta 2016

4

게임 후반에-그러나 대답 중 어느 것도 나를 위해 일하지 않았고 (모두 시도하지 않았습니다) 내 검색 에서이 대답을 두 번 이상 발견했기 때문에 ... 파이썬 3 에서이 솔루션은 매우 우아합니다 저자가 찾고있는 일을 정확히 수행한다고 생각합니다. 동일한 줄에 단일 문장을 업데이트합니다. 줄이 늘어나는 대신 축소되는 경우 특수한 작업을 수행해야 할 수 있습니다 (예 : 끝에 패딩 된 공백이있는 고정 길이로 문자열 만들기)

if __name__ == '__main__':
    for i in range(100):
        print("", end=f"\rPercentComplete: {i} %")
        time.sleep(0.2)

파이썬을위한 가장 간단하고 깨끗한 옵션 => 3.6
DaveR

3

이것은 나를 위해 작동하며 가능한지 확인하기 위해 한 번 해킹했지만 실제로 내 프로그램에서 사용되지 않았습니다 (GUI가 훨씬 더 좋습니다).

import time
f = '%4i %%'
len_to_clear = len(f)+1
clear = '\x08'* len_to_clear
print 'Progress in percent:'+' '*(len_to_clear),
for i in range(123):
    print clear+f % (i*100//123),
    time.sleep(0.4)
raw_input('\nDone')

2
import time
import sys


def update_pct(w_str):
    w_str = str(w_str)
    sys.stdout.write("\b" * len(w_str))
    sys.stdout.write(" " * len(w_str))
    sys.stdout.write("\b" * len(w_str))
    sys.stdout.write(w_str)
    sys.stdout.flush()

for pct in range(0, 101):
    update_pct("{n}%".format(n=str(pct)))
    time.sleep(0.1)

\b커서 다시 한 공간의 위치를 이동합니다
우리가 행의 시작 부분에 모두에게 길을 뒤로 이동 그래서
우리가 앞으로 커서 이동 공간을 쓰기로 / 우 하나 - 우리는 다음 쓰기 공간이 현재 행을 취소
그럼 우리가 새 데이터를 쓰기 전에 커서를 줄의 시작 부분으로 다시 이동합니다.

Python 2.7을 사용하여 Windows cmd에서 테스트되었습니다.


1

다음과 같이 시도하십시오.

for i in some_list:
    #do a bunch of stuff.
    print i/len(some_list)*100," percent complete",

(끝에 쉼표가 있습니다.)


이것은 단지 이전에 새 텍스트를 추가합니다 (기능적으로 유사하지만보기 흉함).
chriscauley 2010-08-05

1

Spyder를 사용하는 경우 줄은 이전의 모든 솔루션으로 계속 인쇄됩니다. 이를 피하는 방법은 다음을 사용하는 것입니다.

for i in range(1000):
    print('\r' + str(round(i/len(df)*100,1)) + '% complete', end='')
    sys.stdout.flush()

이것이 저에게 유일한 솔루션이었습니다 (Python 3.8, Windows, PyCharm).
z33k

0

이것을 사용 하는 Remi 대답 을 기반으로 Python 2.7+:

from __future__ import print_function
import time

# status generator
def range_with_status(total):
    """ iterate from 0 to total and show progress in console """
    import sys
    n = 0
    while n < total:
        done = '#' * (n + 1)
        todo = '-' * (total - n - 1)
        s = '<{0}>'.format(done + todo)
        if not todo:
            s += '\n'
        if n > 0:
            s = '\r' + s
        print(s, end='\r')
        sys.stdout.flush()
        yield n
        n += 1


# example for use of status generator
for i in range_with_status(50):
    time.sleep(0.2)

0

s가 아닌 Python 3.6+임의의 경우 와 콘솔 창의 전체 너비를 사용하고 새 줄로 넘어 가지 않는 경우 다음을 사용할 수 있습니다.listint

참고 :이 기능 get_console_with()은 Linux 기반 시스템에서만 작동하므로 Windows에서 작동하려면 다시 작성해야합니다.

import os
import time

def get_console_width():
    """Returns the width of console.

    NOTE: The below implementation works only on Linux-based operating systems.
    If you wish to use it on another OS, please make sure to modify it appropriately.
    """
    return int(os.popen('stty size', 'r').read().split()[1])


def range_with_progress(list_of_elements):
    """Iterate through list with a progress bar shown in console."""

    # Get the total number of elements of the given list.
    total = len(list_of_elements)
    # Get the width of currently used console. Subtract 2 from the value for the
    # edge characters "[" and "]"
    max_width = get_console_width() - 2
    # Start iterating over the list.
    for index, element in enumerate(list_of_elements):
        # Compute how many characters should be printed as "done". It is simply
        # a percentage of work done multiplied by the width of the console. That
        # is: if we're on element 50 out of 100, that means we're 50% done, or
        # 0.5, and we should mark half of the entire console as "done".
        done = int(index / total * max_width)
        # Whatever is left, should be printed as "unfinished"
        remaining = max_width - done
        # Print to the console.
        print(f'[{done * "#"}{remaining * "."}]', end='\r')
        # yield the element to work with it
        yield element
    # Finally, print the full line. If you wish, you can also print whitespace
    # so that the progress bar disappears once you are done. In that case do not
    # forget to add the "end" parameter to print function.
    print(f'[{max_width * "#"}]')


if __name__ == '__main__':
    list_of_elements = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
    for e in range_with_progress(list_of_elements):
        time.sleep(0.2)


0

Python 3을 사용하는 경우 이것은 당신을위한 것이며 실제로 작동합니다.

print(value , sep='',end ='', file = sys.stdout , flush = False)

0

Python 3 이상

for i in range(5):
    print(str(i) + '\r', sep='', end ='', file = sys.stdout , flush = False)

0

카운트 다운을 보여주기 위해 이것을 스스로 알아 냈지만 백분율에서도 작동합니다.

import time
#Number of seconds to wait
i=15
#Until seconds has reached zero
while i > -1:
    #Ensure string overwrites the previous line by adding spaces at end
    print("\r{} seconds left.   ".format(i),end='')
        time.sleep(1)
        i-=1
    print("") #Adds newline after it's done

'/ r'뒤에 오는 것이 이전 문자열과 길이가 같거나 더 길면 (공백 포함) 같은 줄에 덮어 씁니다. end = ''를 포함했는지 확인하십시오. 그렇지 않으면 개행으로 인쇄됩니다. 도움이 되었기를 바랍니다.


0

StartRunning (), StopRunning (), boolean getIsRunning () 및 0 ~ 100 범위의 값을 반환하는 정수 getProgress100 ()을 제공하는 객체 "pega"의 경우 실행 중 텍스트 진행률 표시 줄을 제공합니다.

now = time.time()
timeout = now + 30.0
last_progress = -1

pega.StartRunning()

while now < timeout and pega.getIsRunning():
    time.sleep(0.5)
    now = time.time()

    progress = pega.getTubProgress100()
    if progress != last_progress:
        print('\r'+'='*progress+'-'*(100-progress)+' ' + str(progress) + "% ", end='', flush=True)
        last_progress = progress

pega.StopRunning()

progress = pega.getTubProgress100()
print('\r'+'='*progress+'-'*(100-progress)+' ' + str(progress) + "% ", flush=True)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.