[python] 한 줄로 동적으로 인쇄

문 사이에 줄 바꿈을 보지 않고 표준 출력을 제공하는 몇 가지 진술을하고 싶습니다.

구체적으로, 내가 가지고 있다고 가정하십시오 :

for item in range(1,100):
    print item

결과는 다음과 같습니다.

1
2
3
4
.
.
.

이것을 어떻게 대신 보이게합니까?

1 2 3 4 5 ...

더 나은 방법 은 마지막 숫자 위에 단일 숫자를 인쇄 할 수 있습니까? 한 번에 하나의 숫자 만 화면에 표시됩니까?



답변

로 변경 print item:

  • print item, 파이썬 2.7에서
  • print(item, end=" ") 파이썬 3에서

데이터를 동적으로 인쇄하려면 다음 구문을 사용하십시오.

  • print(item, sep=' ', end='', flush=True) 파이썬 3에서

답변

그건 그렇고 …… 한곳에서 mi를 인쇄 할 때마다 새로 고침하는 방법은 숫자를 변경하십시오.

일반적으로 터미널 제어 코드를 사용하는 방법 입니다. 이것은 특히 간단한 경우입니다. 단 하나의 특수 문자가 필요합니다. U + 000D 캐리지 리턴 '\r'은 Python (및 기타 여러 언어)으로 작성됩니다. 코드를 기반으로 한 완전한 예는 다음과 같습니다.

from sys import stdout
from time import sleep
for i in range(1,20):
    stdout.write("\r%d" % i)
    stdout.flush()
    sleep(1)
stdout.write("\n") # move the cursor to the next line

이것에 대해 놀라운 점이 있습니다.

  • \r프로그램이 실행되는 동안, 커서는 항상 숫자 뒤에있을 것입니다, 그래서 문자열의 시작 부분에 간다. 이것은 외형적인 것이 아닙니다. 다른 터미널 에뮬레이터는 다른 방식으로하면 혼란 스럽습니다.
  • 마지막 줄을 포함하지 않으면 프로그램이 종료 된 후 쉘이 번호 위에 프롬프트를 인쇄합니다.
  • stdout.flush일부 시스템에 필요하거나 출력을받지 않습니다. 다른 시스템에서는 필요하지 않지만 해를 끼치 지 않습니다.

이것이 작동하지 않는다는 것을 알게되면, 가장 먼저 의심해야 할 것은 터미널 에뮬레이터에 버그가 있다는 것입니다. vttest 프로그램은 당신이 그것을 테스트 할 수 있습니다.

당신은 대체 할 수 stdout.write로모그래퍼 print문하지만 혼합하지 않으려는 print파일 객체를 직접 사용하여.


답변

print item,인쇄 문이 개행을 생략하도록하는 데 사용 합니다.

파이썬 3에서는 print(item, end=" ")입니다.

모든 숫자를 같은 위치에 표시하려면 예를 들어 (Python 2.7)을 사용하십시오.

to = 20
digits = len(str(to - 1))
delete = "\b" * (digits + 1)
for i in range(to):
    print "{0}{1:{2}}".format(delete, i, digits),

파이썬 3에서는 조금 더 복잡합니다. 여기에서 플러시 sys.stdout하거나 루프가 완료 될 때까지 아무것도 인쇄하지 않습니다.

import sys
to = 20
digits = len(str(to - 1))
delete = "\b" * (digits)
for i in range(to):
   print("{0}{1:{2}}".format(delete, i, digits), end="")
   sys.stdout.flush()


답변

다른 예제와 마찬가지로
비슷한 접근법을 사용하지만 마지막 출력 길이 등을 계산하는 데 시간을 소비하는 대신

ANSI 코드 이스케이프를 사용하여 줄의 처음으로 돌아간 다음 현재 상태 출력을 인쇄하기 전에 전체 줄을 지 웁니다.

import sys

class Printer():
    """Print things to stdout on one line dynamically"""
    def __init__(self,data):
        sys.stdout.write("\r\x1b[K"+data.__str__())
        sys.stdout.flush()

반복 루프에서 사용하려면 다음과 같이 호출하면됩니다.

x = 1
for f in fileList:
    ProcessFile(f)
    output = "File number %d completed." % x
    Printer(output)
    x += 1   

여기 더 참조


답변

각 반복에서 줄 바꿈 대신 공백을 인쇄하기 위해 print 문에 후행 쉼표를 추가 할 수 있습니다.

print item,

또는 Python 2.6 이상을 사용하는 경우 새로운 인쇄 기능을 사용할 수 있습니다.이 기능을 사용하면 인쇄중인 각 항목의 끝에 공백이 없어야 함을 지정할 수 있습니다. 필요):

from __future__ import print_function
...
print(item, end="")

마지막으로 파일과 같은 객체를 반환하는 sys 모듈에서 가져 와서 표준 출력에 직접 쓸 수 있습니다.

from sys import stdout
...
stdout.write( str(item) )


답변

변화

print item

print "\033[K", item, "\r",
sys.stdout.flush()
  • “\ 033 [K”는 줄 끝까지 지 웁니다.
  • \ r은 줄의 처음으로 돌아 간다
  • flush 문은 즉시 출력되도록하여 실시간 출력을 얻습니다.

답변

간단한 조인이 작동해야한다고 생각합니다.

nl = []
for x in range(1,10):nl.append(str(x))
print ' '.join(nl)