한 줄로 동적으로 인쇄


306

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

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

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

결과는 다음과 같습니다.

1
2
3
4
.
.
.

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

1 2 3 4 5 ...

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


답변:


482

로 변경 print item:

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

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

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

에서 http://docs.python.org/reference/simple_stmts.html#print을 :>은 '\n'문자는 제외하고, 마지막에 기록 된 print문 종료 쉼표. 명령문에 키워드 만 포함 된 경우 이것이 유일한 조치 print입니다.
ewall

5
참고 : print (item, end = "")는 파일 상단에 ' 미래의 import from print_function'을 추가하여 Python2.7에서 사용할 수 있습니다 .
Hec

2
그러나 불행히도 flush작동하지 않습니다 from __future__ import print_function.
Timmmm

@ewall 내가해야 print(item, end=", ")한다면 ,마지막 항목에 추가하지 못하게하는 방법을 마지막 항목에 추가 ,한다
MarcoBianchi

@SamirTendulkar 원래 질문처럼 for-loop를 사용하는 경우 목록의 마지막 항목을 다르게 처리하는 특별한 경우를 만들 수 있습니다.
ewall

156

그건 그렇고 ...... 한곳에서 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파일 객체를 직접 사용하여.


flush () 함수는 무엇입니까? 그 기능없이 저에게 효과적이기 때문에!
Pol

1
일반적으로 Python의 파일 객체는 데이터를 축적하여 운영 체제에 큰 덩어리로 보낼 수 있습니다. 이것은 일반적으로 디스크의 파일에 액세스하려는 것이지만 이러한 종류의 작업을 방해합니다. flush()파일이 운영 체제에있는 모든 것을 지금 보내도록합니다. 그것이 없으면 당신을 위해 일한다는 것에 놀랐습니다. 추가 할 때까지는 효과가 없었습니다.
zwol

1
@ user1995839 커서를 숨길 수있는 제어 코드가 있지만 그렇게하려면 사용하는 것이 좋습니다 ncurses.
zwol

1
sys.stdout.flush()내에서 mendatory 것으로 보인다 FreebsdPython 2.7
하킴

1
캐리지 리턴은 파이썬 REPL (적어도 나에게는 우분투에서는)에서 제대로 작동하지 않습니다. 이 작업을 수행하려면 REPL 명령을 실행하는 것이 아니라 script를 실행해야합니다 .
Mark Amery

50

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()

실제로, 솔루션이 매번 같은 수의 백 스페이스를 인쇄하는 것처럼 보입니다. 따라서 20으로 설정하면 숫자 1..9를 인쇄하는 동안 추가 백 스페이스가 인쇄됩니다. 루프 내부의 숫자를 계산하고 i 값을 기준으로하지 않아야합니까?
Adam Crossland

숫자를 오른쪽 정렬하고 항상 모든 것을 삭제합니다. 나는 그것을하는 것이 더 빠르거나 각 반복에서 지금 얼마나 많은 자릿수가 지워지는지를 계산하는 것이 더 빠른지 테스트하지 않았습니다.
Tim Pietzcker

또는 자릿수가 변경 될 때를 고려하여 이전 i 값을 기준으로합니다.
Adam Crossland

아 맞다. 나는 정당화를 간과했다. 좋은 해결책.
Adam Crossland

상당히 복잡한 것 같습니다. 1 년 후 내 코드를 살펴 봐야한다면 내가 한 일을 이해하지 못했을 것입니다. (2007 년에 작성한 프로그램을 읽어야 만했습니다. 그래서 기쁜 나는 파이썬을 썼다.)
팀 Pietzcker

16

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

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   

여기 더 참조


14

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

print item,

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

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

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

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

13

변화

print item

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

이것은 파이썬 2.7에 좋습니다. \033[K코드 에 대해 배운 위치에 대한 참조를 제공 할 수 있습니까 ? 그들에 대해 더 배우고 싶습니다.
Klik

print이미 내부적으로 플러시됩니다. 전화 할 필요가 없습니다. 화면을 비워야하는 곳 print과 다릅니다sys.stdout.write()
Gabriel Fair

5

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

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

4
이해력은 더 잘 읽고 아마도 더 빠를 것입니다 : print ' '.join(str(x) for x in range(1, 10)).
Mu Mind

나는 목록 이해의 두 번째 사용. 이 경우 읽기가 더 쉬워집니다.
Austin Henley

5

2.7에서 사용하고있는 또 다른 대답은 "."을 인쇄하는 것입니다. 루프가 실행될 때마다 (사용자에게 여전히 실행 중임을 표시하기 위해) 다음과 같습니다.

print "\b.",

"."를 인쇄합니다. 공백이없는 문자 조금 더 좋아 보이고 꽤 잘 작동합니다. \ b는 궁금한 사람들을위한 백 스페이스 문자입니다.


4

너무 많은 복잡한 답변. 파이썬 3을 가지고 있다면 \r, 인쇄 시작 부분에 넣고 추가 end='', flush=True하십시오.

import time

for i in range(10):
    print(f'\r{i} foo bar', end='', flush=True)
    time.sleep(0.5)

이것은 0 foo bar, 그 1 foo bar뒤에 등 을 씁니다 .


고맙습니다, 그게 내가 필요한 것입니다print('\r' + filename + " ", end = '', flush=True)
McPeppr

3

숫자를 서로 덮어 쓰려면 다음과 같이하십시오.

for i in range(1,100):
    print "\r",i,

첫 번째 열에 숫자가 인쇄되어 있으면 작동합니다.

편집 : 다음은 첫 번째 열에 인쇄되지 않은 경우에도 작동하는 버전입니다.

prev_digits = -1
for i in range(0,1000):
    print("%s%d" % ("\b"*(prev_digits + 1), i)),
    prev_digits = len(str(i))

이 코드는 Windows의 Python 2.5, WIndows 콘솔에서 테스트되었으며 정상적으로 작동합니다. 다른 일부에 따르면, 결과를 보려면 stdout 플러싱이 필요할 수 있습니다. YMMV.


3

"그런데 ...... 한곳에서 mi를 인쇄 할 때마다 새로 고침하는 방법만으로 숫자를 변경하면됩니다."

정말 까다로운 주제입니다. 무슨 (콘솔 제어 코드를 출력) 제안하는 것을 달성 할 수있는 한 가지 방법입니다.

(n) 저주를 사용할 수 있지만 주로 * nixes에서 작동합니다.

거의 언급되지 않은 Windows (그리고 여기에 흥미로운 부분이 있습니다)에서 WinAPI에 대한 파이썬 바인딩을 사용할 수 있습니다 ( http://sourceforge.net/projects/pywin32/ ActivePython과 함께 기본적으로)-그렇지 않습니다 그 열심히하고 잘 작동합니다. 다음은 작은 예입니다.

import win32console, time

output_handle = win32console.GetStdHandle(  win32console.STD_OUTPUT_HANDLE )
info = output_handle.GetConsoleScreenBufferInfo()
pos = info["CursorPosition"]

for i in "\\|/-\\|/-":
    output_handle.WriteConsoleOutputCharacter( i, pos )
    time.sleep( 1 )

또는 사용하려는 경우 print(설명 또는 기능, 차이 없음) :

import win32console, time

output_handle = win32console.GetStdHandle(  win32console.STD_OUTPUT_HANDLE )
info = output_handle.GetConsoleScreenBufferInfo()
pos = info["CursorPosition"]

for i in "\\|/-\\|/-":
    print i
    output_handle.SetConsoleCursorPosition( pos )
    time.sleep( 1 )

win32console 모듈을 사용하면 Windows 콘솔로 더 많은 흥미로운 일을 할 수 있습니다 ... WinAPI의 큰 팬은 아니지만 최근에 반감기의 절반 이상이 C로 WinAPI 코드를 작성하여 발생한다는 것을 깨달았습니다. 사용하기 훨씬 쉽습니다.

다른 모든 대답은 물론 훌륭합니다. 그러나 이전 줄 에 인쇄하려면 어떻게해야 합니까? 아니면 여러 줄로 된 텍스트를 지우고 같은 줄을 다시 쓰는 것보다 씁니까? 내 솔루션으로 가능합니다.



1
In [9]: print?
Type:           builtin_function_or_method
Base Class:     <type 'builtin_function_or_method'>
String Form:    <built-in function print>
Namespace:      Python builtin
Docstring:
    print(value, ..., sep=' ', end='\n', file=sys.stdout)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep:  string inserted between values, default a space.
end:  string appended after the last value, default a newline.

0

숫자 만 인쇄하려면 루프를 피할 수 있습니다.

# python 3
import time

startnumber = 1
endnumber = 100

# solution A without a for loop
start_time = time.clock()
m = map(str, range(startnumber, endnumber + 1))
print(' '.join(m))
end_time = time.clock()
timetaken = (end_time - start_time) * 1000
print('took {0}ms\n'.format(timetaken))

# solution B: with a for loop
start_time = time.clock()
for i in range(startnumber, endnumber + 1):
    print(i, end=' ')
end_time = time.clock()
timetaken = (end_time - start_time) * 1000
print('\ntook {0}ms\n'.format(timetaken))

12 34 5678 9 10 11 12 1314 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100 21.1986929975ms를했다

12 34 5678 9 10 11 12 1314 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99100 491.466823551ms 걸렸다


대신 목록 이해력이 더 빠릅니다 map.
cji

예 좋은 예입니다. 마음에 들지만 파싱 결과를 보여줘야합니다. 먼저 남은 양을 인쇄하는 것보다 데이터베이스 항목을 계산합니다.
Pol

0

이것을 달성하는 가장 좋은 방법은 \r캐릭터 를 사용하는 것입니다

아래 코드를 사용해보십시오.

import time
for n in range(500):
  print(n, end='\r')
  time.sleep(0.01)
print()  # start new line so most recently printed number stays

0

파이썬 3에서는 다음과 같이 할 수 있습니다 :

for item in range(1,10):
    print(item, end =" ")

출력 :

1 2 3 4 5 6 7 8 9 

튜플 : 튜플을 사용 하여 동일한 작업을 수행 할 수 있습니다.

tup = (1,2,3,4,5)

for n in tup:
    print(n, end = " - ")

출력 :

1 - 2 - 3 - 4 - 5 - 

다른 예시:

list_of_tuples = [(1,2),('A','B'), (3,4), ('Cat', 'Dog')]
for item in list_of_tuples:
    print(item)

출력 :

(1, 2)
('A', 'B')
(3, 4)
('Cat', 'Dog')

다음과 같이 튜플의 포장을 풀 수도 있습니다.

list_of_tuples = [(1,2),('A','B'), (3,4), ('Cat', 'Dog')]

# Tuple unpacking so that you can deal with elements inside of the tuple individually
for (item1, item2) in list_of_tuples:
    print(item1, item2)   

출력 :

1 2
A B
3 4
Cat Dog

다른 변형 :

list_of_tuples = [(1,2),('A','B'), (3,4), ('Cat', 'Dog')]
for (item1, item2) in list_of_tuples:
    print(item1)
    print(item2)
    print('\n')

출력 :

1
2


A
B


3
4


Cat
Dog

나는 모든 예제를 시도했지만 파이썬 3.8에서는 작동하지 않습니다. 더 많은 답변을 얻으십시오.
KOTZ

나는 파이썬 3.7
Stryker

내 말은 이러한 옵션 중 어느 것도 질문 끝에 제안 된 마지막 숫자를 덮어 쓰지 않는다는 것입니다.
KOTZ

0

인쇄 문의 끝에 쉼표가 새 줄을 생략합니다.

for i in xrange(1,100):
  print i,

그러나 이것은 덮어 쓰지 않습니다.


0

내가했던 것처럼 고생하는 사람들을 위해 파이썬 3.7.4와 3.5.2에서 모두 작동하는 것으로 보이는 다음을 생각해 냈습니다.

매우 빠르게 실행되고 출력이 표시되지 않을 수 있으므로 범위를 100에서 1,000,000으로 확장했습니다. 설정의 한 가지 부작용 end='\r'은 최종 루프 반복이 모든 출력을 지우기 때문입니다. 그것이 작동한다는 것을 증명하기 위해 더 긴 숫자가 필요했습니다. 이 결과는 모든 경우에 바람직하지는 않지만 내 결과는 좋았으며 OP는 어떤 식 으로든 지정하지 않았습니다. 반복되는 배열의 길이 등을 평가하는 if 문으로 잠재적으로 이것을 피할 수 있습니다. 제 경우에 작동하게하는 열쇠는 대괄호 "{}".format() . 그렇지 않으면 작동하지 않았습니다.

아래는 그대로 작동해야합니다.

#!/usr/bin/env python3

for item in range(1,1000000):
    print("{}".format(item), end='\r', flush=True)

0
for item in range(1,100):
    if item==99:
        print(item,end='')
    else:
        print (item,end=',')

출력 : 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24, 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49, 50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74, 75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99


0

또는 더 간단합니다.

import time
a = 0
while True:
    print (a, end="\r")
    a += 1
    time.sleep(0.1)

end="\r" 첫 번째 인쇄의 시작 [0 :]부터 덮어 씁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.