파이썬에서 같은 줄에 여러 번 인쇄


229

기본적으로 다음과 같은 출력을 보여주는 스크립트를 실행하고 싶습니다.

Installing XXX...               [DONE]

현재 Installing XXX...먼저 인쇄 한 다음 인쇄 [DONE]합니다.

그러나 이제는 같은 줄에 인쇄 Installing xxx...하고 싶습니다 [DONE].

어떤 아이디어?



1
이 질문에 대한 답변은 때로는 줄을 지우고 싶다고 언급하지 않습니다. stackoverflow.com/questions/45263205
ideasman42

답변:


284

print명령문을 사용하여 가져 오기없이이를 수행 할 수 있습니다 sys.

def install_xxx():
   print "Installing XXX...      ",

install_xxx()
print "[DONE]"

print줄 끝에있는 쉼표는 줄을 print새로 만들지 못하도록 합니다 (출력 끝에 여분의 공간이있을 것입니다).

Python 3 솔루션
위의 내용은 Python 3에서 작동하지 않기 때문에 대신 (가져 오기없이 sys) 이를 수행 할 수 있습니다 .

def install_xxx():
    print("Installing XXX...      ", end="", flush=True)

install_xxx()
print("[DONE]")

인쇄 기능은 end기본값 인을 사용 "\n"합니다. 빈 문자열로 설정하면 줄 끝에서 새 줄을 발행 할 수 없습니다.


1
완벽하게 작동합니다. 지금까지 stdout 솔루션 만 보았습니다. 정말 잘 알고 있습니다.
Prometheus

5
인쇄와 시간이 많이 걸리는 작업이 모두 같은 기능 / 들여 쓰기 수준 인 경우에는 작동하지 않습니다. 동작이 시작되기 전에는 출력이 전혀없고 출력이 완료된 후에 출력이 전체로 나타납니다
Paddre

2
그것은 아마도 프로세스 전체에 대해 OS에 의해 수행되는 출력 버퍼링의 기능 일 것입니다. 파이썬 관련 문제는 아닙니다. 파이썬 관련 해결 방법 은 stackoverflow.com/questions/107705 를 참조하십시오 .
다중

13
줄 바꿈이 없으면 버퍼를 명시 적으로 플러시 할 수 있습니다. 사용 print("...", end="", flush=True)파이썬 3는, 파이썬 2에서 추가 sys.stdout.flush()전화.
Martijn Pieters

7
python 3.x에서는 "\ r"을 추가하여 인쇄 된 라인 VS를 그 끝에 추가합니다print("Progress: {}%".format(var), end="\r", flush=True)
John

103

간단히 이것을 사용할 수 있습니다 :

print 'something',
...
print ' else',

출력은

something else

에 의해 과잉 살필 필요가 없습니다 import sys. 끝에 쉼표 기호에주의하십시오.

print("some string", end="");마지막에 줄 바꿈 삽입을 제거하는 Python 3 이상 . 더 읽어보기help(print);


3
이 방법을 사용하면 두 개의 공백이 있습니다.
ethanjyx

1
가장 간단하고 효율적인 답변입니다.
gixxer

인쇄 인수가 괄호 안에 있으면 작동하지 않습니다. <print "hello";; print ( "hello")>하지만 작동하지 않습니다. <print ( "hello",); print ( "hello")>
Mayank Jaiswal

@MayankJaiswal 이것은 파 렌스와 함께 작동합니다. print ( 'hello'),
drglove

1
print함수 파이썬 2 VS 3. 약간 다른 구문
boldnik

52

콘솔 출력에서 ​​이전 위치로 돌아가 려면 백 스페이스 ' \ r '또는 ( ' \ x08 ') char을 사용해야 합니다.

파이썬 2 이상 :

import time
import sys

def backspace(n):
    sys.stdout.write((b'\x08' * n).decode()) # use \x08 char to go back   

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(s)                     # just print
    sys.stdout.flush()                      # needed for flush when using \x08
    backspace(len(s))                       # back n chars    
    time.sleep(0.2)                         # sleep for 200ms

파이썬 3 :

import time   

def backline():        
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print(s, end='')                        # just print and flush
    backline()                              # back to the beginning of line    
    time.sleep(0.2)                         # sleep for 200ms

이 코드는 한 줄에 0 %에서 100 %까지 계산됩니다. 최종 가치는 다음과 같습니다.

> python test.py
100%

이 경우 flush에 대한 추가 정보는 다음과 같습니다. 왜 'end ='인수를 포함하는 python print 문이 while 루프에서 다르게 동작합니까?


1
명확히하기 위해,이 예제에서 주석 처리 된 코드는 Python 2 용이고 주석 처리되지 않은 행은 Python 3 용입니다.
Turtles Are Cute

1
bouth 행은 Python 3에서 잘 작동합니다. '\ x08'을 백 스페이스로 사용하면 출력 스트림을 플러시해야합니다-print ((b '\ x08'* n) .decode (), end = '', flush = True)
Vadim Zin4uk 9

1
캐리지 리턴 '\ r'은 줄의 처음으로 돌아갑니다. 따라서 '* n'은 불필요합니다
bjnortier

43

sys.stdout.write('Installing XXX... ')및을 사용하십시오 sys.stdout.write('Done'). 이런 식으로 "\n"인쇄 기능을 다시 만들려면 새 줄을 직접 추가해야 합니다. 나는 이것을 위해 저주를 사용할 필요가 없다고 생각합니다.


4
필자는 개인적 으로이 솔루션을 선호도가 높은 솔루션보다 선호합니다. 왜냐하면 __future__수입품이나 그 밖의 것에 의존 할 필요없이 python2.x와 python3.x에서 똑같은 방식으로 작동하기 때문 입니다.
mgilson

17

새로운 라인이 나올 때까지 모두 일시 중지 되었기 때문에 답이 없습니다. 간단한 도우미를 작성했습니다.

def print_no_newline(string):
    import sys
    sys.stdout.write(string)
    sys.stdout.flush()

그것을 테스트하려면 :

import time
print_no_newline('hello ')
# Simulate a long task
time.sleep(2)
print('world')

"hello"는 먼저 잠자기 전에 인쇄하고 화면을 플러시합니다. 그런 다음 표준 인쇄를 사용할 수 있습니다.


1
감사합니다! 정확히 내가 일명 .flush () 필요
MrNice


11

가장 간단한 :

파이썬 3

    print('\r' + 'something to be override', end='')

그것은 무언가를 인쇄하고 같은 줄에서 끝나는 것보다 커서를 처음으로 되돌릴 것임을 의미합니다. 루프 상태이면 시작과 같은 장소에서 인쇄를 시작합니다.


3
멋있는! Windows에서도 작동합니다.
Shital Shah

2
고마워 이것은 나를 위해 잘 작동합니다! print(’something to be override’, end=‘\r’)그래도 더 간단 하다고 생각합니다 .
Tropilio


9

인쇄에는 선택적인 end인수가 있으며 결국 인쇄됩니다. 기본값은 줄 바꿈이지만 빈 문자열로 변경할 수 있습니다. 예 :print("hello world!", end="")


2
이것은 파이썬 3에 있습니다. 파이썬 2에서는 간단하게 할 수 있습니다 print 'something',. 끝에 쉼표가 있으면 줄 바꿈이 추가되지 않습니다.
arjoonn

4

당신이 (계속보다는에 추가) 이전 줄을 덮어하려는 경우, 당신은 결합 할 수 \rprint(),인쇄 문장의 끝에서. 예를 들어

from time import sleep

for i in xrange(0, 10):
    print("\r{0}".format(i)),
    sleep(.5)

print("...DONE!")

콘솔의 이전 숫자를 대체하여 0에서 9까지 계산합니다. 는 "...DONE!"마지막 카운터, 9와 같은 줄에 인쇄됩니다.

OP의 경우 콘솔에서 설치 완료율을 "진행률 표시 줄"로 표시하여 시작 및 종료 문자 위치를 정의하고 그 사이에 마커를 업데이트 할 수 있습니다.

print("Installing |XXXXXX              | 30%"),

4

다음은 @ Vadim-Zin4uk의 3.0 버전에서 파생 된 2.7 호환 버전입니다.

파이썬 2

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print '{0}\r'.format(s),                # just print and flush

    time.sleep(0.2)

그 문제에 대해 제공된 3.0 솔루션이 약간 부풀어 보입니다. 예를 들어, 백 스페이스 메소드는 정수 인수를 사용하지 않으며 아마도 완전히 제거 될 수 있습니다.

파이썬 3

import time

for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    print('{0}\r'.format(s), end='')        # just print and flush

    time.sleep(0.2)                         # sleep for 200ms

둘 다 테스트되고 작동했습니다.


2

이것은 매우 오래된 스레드이지만 여기에 매우 철저한 답변과 샘플 코드가 있습니다.

\rASCII 문자 집합에서 캐리지 리턴 의 문자열 표현입니다 . 8 진수 015[ chr(0o15)] 또는 16 진 0d[ chr(0x0d)] 또는 10 진수 13[ chr(13)]와 같습니다. man ascii지루한 읽기를 참조하십시오 . ( \r)는 이식성이 뛰어나며 사람들이 쉽게 읽을 수 있습니다. 그것은 단순히 용지를 전진시키지 않고 타자기의 캐리지를 처음으로 다시 이동시키는 것을 의미합니다. 캐리지 리턴 및 줄 바꿈 을 의미 하는 CR부분입니다 .CRLF

print()Python 3의 함수입니다. Python 2 (사용하고자하는 모든 버전) print에서 __future__모듈 에서 정의를 가져 와서 함수에 강제로 포함시킬 수 있습니다 . 이 print기능 의 장점은 \n모든 print()통화 가 끝날 때 새 줄을 인쇄하는 기본 동작을 무시하고 마지막에 인쇄 할 항목을 지정할 수 있다는 것 입니다.

sys.stdout.flush파이썬이 표준 출력 의 출력을 플러시하도록 지시 합니다 . 이것은 print()달리 지정하지 않는 한 출력을 보내는 곳 입니다. 또한 python -uenvironment variable 로 실행 하거나 설정 하여 동일한 동작을 얻을 수 있으므로 및 호출 PYTHONUNBUFFERED=1을 건너 뜁니다 . 그렇게하면 얻을 수있는 양은 거의 정확하게 0이며 응용 프로그램이 올바르게 작동하기 전에 해당 단계를 수행해야한다는 것을 잊어 버린 경우 디버깅하기가 쉽지 않습니다.import syssys.stdout.flush()

그리고 샘플. 이것은 Python 2 또는 3에서 완벽하게 실행됩니다.

from __future__ import print_function

import sys
import time

ANS = 42
FACTORS = {n for n in range(1, ANS + 1) if ANS % n == 0}

for i in range(1, ANS + 1):
    if i in FACTORS:
        print('\r{0:d}'.format(i), end='')
        sys.stdout.flush()
        time.sleep(ANS / 100.0)
else:
    print()

: 나는 당신의 대답은 더 적합하다고 생각 stackoverflow.com/questions/45263205/...
마크 Cayuela Rafols

2

print ()에는 기본적으로 "\ n"으로 설정된 "end"매개 변수가 있습니다. print ( "This is America") 호출은 실제로 print ( "This is America", end = "\ n")를 호출합니다. 쉬운 방법은 print ( "This is America", end = "")를 호출하는 것입니다


1

배열에 값을 미리 저장 한 경우 다음 형식으로 호출 할 수 있습니다.

for i in range(0,n):
       print arr[i],

1

파이썬은 줄 바꿈을 인쇄 끝으로 추가합니다. 줄 바꿈 대신 공백을 추가하려면 print 메소드에 python3에 end = ''를 사용하십시오. python2의 경우 print 문 끝에서 쉼표를 사용하십시오.

print("Foo",end=' ')
print('Bar')

0

Quora post를 찾았 습니다 .이 예제는 저에게 효과적이었습니다 (파이썬 3). 필요한 것에 더 가깝습니다 (예 : 전체 이전 줄 지우기).

그들이 제공하는 예는 다음과 같습니다.

def clock():
   while True:
       print(datetime.now().strftime("%H:%M:%S"), end="\r")

다른 사람들이 제안한 것처럼 같은 줄에 인쇄하려면 다음을 사용하십시오. end=""


-2

이 솔루션을 찾았으며 Python 2.7에서 작동하고 있습니다.

# Working on Python 2.7 Linux

import time
import sys


def backspace(n):
    print('\r', end='')                     # use '\r' to go back


for i in range(101):                        # for 0 to 100
    s = str(i) + '%'                        # string for output
    sys.stdout.write(string)
    backspace(len(s))                       # back for n chars
    sys.stdout.flush()
    time.sleep(0.2)                         # sleep for 200ms

1
그것은 printPython 2.7의 잘못된 구문이며 올바른 구문으로도 코드가 작동하지 않습니다.
Cory Madden
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.