파이썬에서 이전 인쇄를 stdout에 덮어 쓰는 방법은 무엇입니까? print x 나는 출력을 얻을

다음 코드가있는 경우 :

for x in range(10):
     print x

나는 출력을 얻을 것이다

1
2
etc..

내가하고 싶은 것은 줄 바꿈을 인쇄하는 대신 이전 값을 바꾸고 같은 줄의 새 값으로 덮어 쓰는 것입니다.



답변

한 가지 방법은 캐리지 리턴 ( '\r') 문자를 사용하여 다음 행으로 이동하지 않고 행의 시작으로 돌아가는 것입니다.

for x in range(10):
    print '{0}\r'.format(x),
print

print 문 끝에있는 쉼표는 다음 행으로 이동하지 않도록 지시합니다. 마지막 print 문은 다음 줄로 이동하므로 프롬프트가 최종 출력을 덮어 쓰지 않습니다.

최신 정보

이제 Python 2가 EOL이므로 Python 3 답변이 더 합리적입니다. Python 3.5 이하의 경우 :

for x in range(10):
    print('{}\r'.format(x), end="")
print()

Python 3.6 이상에서는 f- 문자열이 더 잘 읽 힙니다.

for x in range(10):
    print(f'{x}\r', end="")
print()

답변

Google을 통해 여기에 왔지만 Python 3을 사용하고 있으므로 Python 3에서 작동하는 방법은 다음과 같습니다.

for x in range(10):
    print("Progress {:2.1%}".format(x / 10), end="\r")

여기 관련 답변 : print 문 뒤에 줄 바꿈을 어떻게 억제 할 수 있습니까?


답변

@Mike DeSimone 답변은 아마도 대부분의 경우 작동합니다. 그러나…

for x in ['abc', 1]:
    print '{}\r'.format(x),

-> 1bc

이것은 '\r'유일한 줄의 시작 부분으로 돌아가지만 출력을 지우지 않기 때문입니다.

편집 : 더 나은 솔루션 (아래의 이전 제안보다)

POSIX 지원이 충분하다면 다음은 현재 줄을 지우고 커서를 시작 부분에 둡니다.

print '\x1b[2K\r',

ANSI 이스케이프 코드를 사용하여 터미널 라인을 지 웁니다. 더 많은 정보는 위키피디아 와이 훌륭한 강연 에서 찾을 수 있습니다 .

이전 답변

내가 찾은 (그다지 좋지 않은) 해결책은 다음과 같습니다.

last_x = ''
for x in ['abc', 1]:
    print ' ' * len(str(last_x)) + '\r',
    print '{}\r'.format(x),
    last_x = x

-> 1

한 가지 장점은 창문에서도 작동한다는 것입니다.


답변

이 스레드를 방문하기 전에 동일한 질문이있었습니다. 나를 위해 sys.stdout.write는 버퍼를 올바르게 플러시하는 경우에만 작동했습니다.

for x in range(10):
    sys.stdout.write('\r'+str(x))
    sys.stdout.flush()

플러시하지 않고 결과는 스크립트 끝 부분에만 인쇄됩니다.


답변

개행을 억제하고 인쇄하십시오 \r.

print 1,
print '\r2'

또는 stdout에 쓰십시오.

sys.stdout.write('1')
sys.stdout.write('\r2')

답변

이 시도:

import time
while True:
    print("Hi ", end="\r")
    time.sleep(1)
    print("Bob", end="\r")
    time.sleep(1)

그것은 나를 위해 일했습니다. end="\r"부분은 이전 줄을 덮어하고있다.

경고!

를 인쇄 hi한 다음를 hello사용하여 인쇄 하면 출력이 이전 두 글자를 덮어 썼기 때문에 \r얻을 수 hillo있습니다. hi공백으로 인쇄하면 (여기에 표시되지 않음) hi. 이 문제를 해결하려면을 사용하여 공백을 인쇄하십시오 \r.


답변

이 페이지의 어떤 솔루션도 IPython 에서 작동하도록 할 수 없었지만 @ Mike-Desimone의 솔루션에 대한 약간의 변형이 작업을 수행했습니다. 캐리지 리턴으로 줄을 종료하는 대신 캐리지 리턴으로 줄을 시작 합니다.

for x in range(10):
    print '\r{0}'.format(x),

또한이 방법에는 두 번째 print 문이 필요하지 않습니다.