답변:
로 변경 print item
:
print item,
파이썬 2.7에서print(item, end=" ")
파이썬 3에서데이터를 동적으로 인쇄하려면 다음 구문을 사용하십시오.
print(item, sep=' ', end='', flush=True)
파이썬 3에서'\n'
문자는 제외하고, 마지막에 기록 된 print
문 종료 쉼표. 명령문에 키워드 만 포함 된 경우 이것이 유일한 조치 print
입니다.
flush
작동하지 않습니다 from __future__ import print_function
.
print(item, end=", ")
한다면 ,
마지막 항목에 추가하지 못하게하는 방법을 마지막 항목에 추가 ,
한다
그건 그렇고 ...... 한곳에서 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()
파일이 운영 체제에있는 모든 것을 지금 보내도록합니다. 그것이 없으면 당신을 위해 일한다는 것에 놀랐습니다. 추가 할 때까지는 효과가 없었습니다.
ncurses
.
sys.stdout.flush()
내에서 mendatory 것으로 보인다 Freebsd
와Python 2.7
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
코드 에 대해 배운 위치에 대한 참조를 제공 할 수 있습니까 ? 그들에 대해 더 배우고 싶습니다.
print
이미 내부적으로 플러시됩니다. 전화 할 필요가 없습니다. 화면을 비워야하는 곳 print
과 다릅니다sys.stdout.write()
간단한 조인이 작동해야한다고 생각합니다.
nl = []
for x in range(1,10):nl.append(str(x))
print ' '.join(nl)
print ' '.join(str(x) for x in range(1, 10))
.
숫자를 서로 덮어 쓰려면 다음과 같이하십시오.
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) 저주를 사용할 수 있지만 주로 * 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 코드를 작성하여 발생한다는 것을 깨달았습니다. 사용하기 훨씬 쉽습니다.
다른 모든 대답은 물론 훌륭합니다. 그러나 이전 줄 에 인쇄하려면 어떻게해야 합니까? 아니면 여러 줄로 된 텍스트를 지우고 같은 줄을 다시 쓰는 것보다 씁니까? 내 솔루션으로 가능합니다.
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.
숫자 만 인쇄하려면 루프를 피할 수 있습니다.
# 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
.
파이썬 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.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)
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
또는 더 간단합니다.
import time
a = 0
while True:
print (a, end="\r")
a += 1
time.sleep(0.1)
end="\r"
첫 번째 인쇄의 시작 [0 :]부터 덮어 씁니다.