programing

한 줄로 동적으로 인쇄

firstcheck 2023. 1. 21. 10:08
반응형

한 줄로 동적으로 인쇄

문 사이에 줄 바꿈 없이 표준 출력을 나타내는 문장이 몇 개 있으면 좋겠습니다.

구체적으로는 다음과 같습니다.

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

결과는 다음과 같습니다.

1
2
3
4
.
.
.

대신 다음과 같이 만드는 방법:

1 2 3 4 5 ...

게다가 마지막 번호에 1개의 번호를 인쇄하는 것이 가능하기 때문에, 한 번에 1개의 번호 밖에 화면에 표시되지 않는 것이 가능한 것입니까?

print item 삭제:

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

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

  • print(item, sep=' ', end='', flush=True) 3Python 3★★

그나저나...매번 새로 고치는 방법 mi를 한 곳에 인쇄하는 방법만 변경해 주세요.

일반적으로 이 방법은 단말기 제어 코드를 사용하는 것입니다.이것은 특히 단순한 경우로, 특수 문자는 1개만 필요합니다.기록된 U+000D 캐리지 리턴'\r'파이썬다음은 코드를 기반으로 한 완전한 예입니다.

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 a print은 섞지 이 좋습니다.print파일 오브젝트를 직접 사용할 수 있습니다.

print item,인쇄 스테이트먼트에 새로운 행을 생략합니다.

Python 입니다.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),

서 Python 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 item

로.

print "\033[K", item, "\r",
sys.stdout.flush()
  • "\033[K"는 행의 끝까지 클리어 됩니다.
  • \r 행의 선두로 돌아갑니다.
  • flush 문을 사용하면 즉시 표시되므로 실시간으로 출력됩니다.

인쇄문에 후행 콤마를 추가하여 각 반복에서 줄바꿈 대신 공백을 인쇄할 수 있습니다.

print item,

또는 Python 2.6 이후를 사용하고 있는 경우, 새로운 인쇄 기능을 사용할 수 있습니다.이 기능을 사용하면, 인쇄하는 각 항목의 말미에 공백조차 표시되지 않게 지정할 수 있습니다(또는 원하는 끝을 지정할 수 있습니다).

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

마지막으로 sys 모듈에서 Import하여 표준 출력에 직접 쓸 수 있습니다.이 경우 파일과 같은 오브젝트가 반환됩니다.

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

★★★★★★★★★★★★★★★★★★★★★★★★★★★3을 는 python 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아, 아, 아, 아, 아, 아, 아.

간단한 결합이 효과적이라고 생각합니다.

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

2.7에서는 루프가 실행될 때마다(사용자에게 아직 실행 중임을 나타내기 위해) ""를 인쇄하고 있습니다.

print "\b.",

공백 없이 "." 문자를 인쇄합니다.조금 나아보이고 작동도 꽤 잘 됩니다.\b는 궁금하신 분들을 위한 백스페이스 문자입니다.

숫자가 서로 덮어쓰도록 하려면 다음과 같은 작업을 수행합니다.

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

"그런데...매번 리프레시 하는 방법.한곳에 mi를 인쇄하는 방법.번호만 변경해 주세요.

정말 어려운 주제야.이를 위해 잭이 제안한 (콘솔 제어 코드 출력)도 한 가지 방법입니다.

욕은 (n)개 사용할 수 있지만, 주로 *nix에서 작동합니다.

거의 언급되지 않는 Windows(그리고 여기 흥미로운 부분이 있습니다)에서는 WinAPI에 대한 Python 바인딩(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를 그다지 좋아하지는 않지만, 최근 WinAPI에 대한 반감의 절반은 C로 WinAPI 코드를 쓰는 것이 훨씬 사용하기 쉽다는 것을 깨달았습니다.

다른 모든 답변들은 훌륭하고, 물론 피조어적이지만...이전 에 인쇄하려면 어떻게 해야 합니까?아니면 여러 줄의 텍스트를 지우고 같은 줄을 다시 쓰는 것보다?내 솔루션이 그것을 가능하게 한다.

Python 2.7 용

for x in range(0, 3):
    print x,

Python 3 용

for x in range(0, 3):
    print(x, end=" ")

Python 3에서는 다음과 같이 할 수 있습니다.

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

출력:

1 2 3 4 5 6 7 8 9 

Tuple: Tuple에서도 같은 작업을 수행할 수 있습니다.

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

또는 보다 심플하게:

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

end="\r"[0:]을 클릭합니다.

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.

인쇄문 끝에 쉼표가 있으면 새 행이 생략됩니다.

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

하지만 덮어쓰지는 않습니다.

저처럼 어려움을 겪고 있는 분들을 위해 python 3.7.4와 3.5.2에서 모두 작동하는 것으로 보이는 다음 사항을 생각해냈습니다.

실행 속도가 매우 빠르고 출력이 표시되지 않을 수 있기 때문에 범위를 100에서 100,000으로 확장했습니다. 설정했을 의 한 이 있기 입니다.end='\r'최종 루프 반복에 의해 모든 출력이 클리어 됩니다.그것이 효과가 있다는 것을 증명하기 위해서는 더 긴 숫자가 필요했다.이 결과는 모든 경우에 바람직하지는 않을 수 있지만, 저는 괜찮았고 OP는 어떤 식으로든 명시하지 않았습니다.반복되는 어레이의 길이를 평가하는 if 스테이트먼트 등을 사용하면 이 문제를 회피할 수 있습니다.게이었죠."{}".format()그렇지 않으면 효과가 없었습니다.

이하와 같이 기능합니다.

#!/usr/bin/env python3

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

주의: 이 솔루션을 지적하는 이유는 지금까지 본 것 중 대부분은 다음 인쇄물의 길이가 이전 인쇄물보다 짧으면 작동하지 않기 때문입니다.

삭제할 항목을 알고 있고 글로벌 변수를 사용할 수 있는 경우 마지막 행을 공백으로 덮어쓸 수 있습니다.

  1. 인쇄하기 전에 문자열의 길이를 'n'로 저장하십시오.
  2. 인쇄하고 '\r'로 끝납니다(줄의 선두로 돌아갑니다).
  3. 다음 번에는 메시지를 인쇄하기 전에 행 위에 'n'개의 공백을 인쇄하십시오.
_last_print_len = 0
def reprint(msg, finish=False):
    global _last_print_len
    
    # Ovewrites line with spaces.
    print(' '*_last_print_len, end='\r')
    
    if finish:
        end = '\n'
        # If we're finishing the line, we won't need to overwrite it in the next print.
        _last_print_len = 0
    else:
        end = '\r'
        # Store len for the next print.
        _last_print_len = len(msg)
    
    # Printing message.
    print(msg, end=end)

예:

for i in range(10):
    reprint('Loading.')
    time.sleep(1)
    reprint('Loading..')
    time.sleep(1)
    reprint('Loading...')
    time.sleep(1)

여기에 이미지 설명 입력

for i in range(10):
    reprint('Loading.')
    time.sleep(1)
    reprint('Loading..')
    time.sleep(1)
    reprint('Loading...', finish=True)
    time.sleep(1)

여기에 이미지 설명 입력

하기 위한 은 ""를 입니다.\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
for item in range(1,100):
    if item==99:
        print(item,end='')
    else:
        print (item,end=',')

출력: 1,2,3,4,6,7,8,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,44,44,47,46,46,47

숫자만 인쇄하는 경우 루프를 피할 수 있습니다.

# 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))
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 100
took 21.1986929975ms

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 100 
took 491.466823551ms

스트링으로 쓰려면

number_string = ""
for i in range(1, 100):
  number_string += str(i)
print(number_string)

언급URL : https://stackoverflow.com/questions/3249524/print-in-one-line-dynamically

반응형