한 줄로 동적으로 인쇄
문 사이에 줄 바꿈 없이 표준 출력을 나타내는 문장이 몇 개 있으면 좋겠습니다.
구체적으로는 다음과 같습니다.
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)
주의: 이 솔루션을 지적하는 이유는 지금까지 본 것 중 대부분은 다음 인쇄물의 길이가 이전 인쇄물보다 짧으면 작동하지 않기 때문입니다.
삭제할 항목을 알고 있고 글로벌 변수를 사용할 수 있는 경우 마지막 행을 공백으로 덮어쓸 수 있습니다.
- 인쇄하기 전에 문자열의 길이를 'n'로 저장하십시오.
- 인쇄하고 '\r'로 끝납니다(줄의 선두로 돌아갑니다).
- 다음 번에는 메시지를 인쇄하기 전에 행 위에 '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
'programing' 카테고리의 다른 글
열이 있는 경우 변경 (0) | 2023.01.21 |
---|---|
레코드의 변경 내역을 추적하는 MySQL 옵션/기능이 있습니까? (0) | 2023.01.21 |
주의: 정의되지 않은 오프셋: 0 in (0) | 2023.01.21 |
폴더 또는 파일 크기 가져오기 (0) | 2023.01.21 |
값을 붙여 임시 열을 추가하다 (0) | 2023.01.21 |