콘솔에서 같은 위치에 출력을 쓰려면 어떻게합니까?


158

나는 파이썬을 처음 사용하고 FTP 서버에서 파일을 자동으로 다운로드하는 스크립트를 작성하고 있습니다. 다운로드 진행 상황을 보여주고 싶지만 다음과 같은 위치에 유지하고 싶습니다.

산출:

FooFile.txt 파일 다운로드 [47 %]

나는 이런 것을 피하려고 노력하고있다 :

     Downloading File FooFile.txt [47%]
     Downloading File FooFile.txt [48%]
     Downloading File FooFile.txt [49%]

어떻게해야합니까?


복제 : 명령 행 응용 프로그램에서 현재 행을 어떻게 인쇄합니까?


1
이 사용하기 쉬운 모듈에 관심이 있으시다면 텍스트 진행 표시 줄입니다. pypi.python.org/pypi/progressbar/2.2
wim

답변:


254

캐리지 리턴을 사용할 수도 있습니다.

sys.stdout.write("Download progress: %d%%   \r" % (progress) )
sys.stdout.flush()

13
매우 일반적이고 간단한 솔루션입니다. 참고 : 선이 터미널 너비보다 길면보기가 좋지 않습니다.
ephemient

5
또한 커서 주위에 반송하지 않았다, 그래서 () sys.stdout.flush에 대한 호출을 추가했다
scottm에

19
여러 줄 로이 작업을 수행 할 수 있습니까? 세 가지 다운로드가 있다고 가정하고 각각의 진행 상황을 자체 라인에 표시하고 싶습니다.
EarlCrapstone

11
\r줄의 시작 부분에 를 넣고 \x1b[K이전 텍스트를 지우려면를 추가 합니다.
augurar

11
그것은 파이썬 3에 대한 가장 간단한 해결책 인 것 같습니다 (아래 답변에서 언급했듯이) : print("sample text", end='\r", flush=True)
Cyrus

35

파이썬 2

나는 다음을 좋아한다 :

print 'Downloading File FooFile.txt [%d%%]\r'%i,

데모:

import time

for i in range(100):
    time.sleep(0.1)
    print 'Downloading File FooFile.txt [%d%%]\r'%i,

파이썬 3

print('Downloading File FooFile.txt [%d%%]\r'%i, end="")

데모:

import time

for i in range(100):
    time.sleep(0.1)
    print('Downloading File FooFile.txt [%d%%]\r'%i, end="")

Python 3을 사용하는 PyCharm 디버거 콘솔

# On PyCharm Debugger console, \r needs to come before the text.
# Otherwise, the text may not appear at all, or appear inconsistently.
# tested on PyCharm 2019.3, Python 3.6

import time

print('Start.')
for i in range(100):
    time.sleep(0.02)
    print('\rDownloading File FooFile.txt [%d%%]'%i, end="")
print('\nDone.')

9
파이썬 3 이상에서 이것을 사용하십시오 : print ( 'FooFile.txt 파일 다운로드 [% d %%] \ r'% i, end = "")
hkoosha

PyCharm Debugger 콘솔에서 텍스트 앞에 \ r이 와야합니다. 그렇지 않으면 텍스트가 전혀 나타나지 않거나 일관되지 않은 것처럼 보일 수 있습니다. 이 답변에 여러 줄 코드를 작성할 수 없으므로 편집으로 작동하는 버전을 추가했습니다. 편집이 승인을 기다리는 동안 사람들이 볼 수 있도록 요점에 배치했습니다. gist.github.com/yulkang/40168c7729a7a7b96d0116d8b1bc26df
Yul Kang

문자열 끝의 "\ r"은 PyCharm 2020.1의 디버거 콘솔 (PyCharm 2020.1.2 (커뮤니티 에디션); 빌드 # PC-201.7846.77, 2020 년 5 월 31 일에 빌드 됨)에서 작동합니다.
들어옵니다

28

curses 모듈 과 같은 터미널 처리 라이브러리를 사용하십시오 .

curses 모듈은 휴대용 고급 터미널 처리를위한 사실상의 표준 인 curses 라이브러리에 대한 인터페이스를 제공합니다.


1
Windows에서는 사용할 수 없습니다.
Diego Herranz

3
@Diego는 Windows에 curses 모듈을위한 지원 라이브러리가 있습니다. 참조 stackoverflow.com/a/19851287/1426237
Plexico

15

백 스페이스 문자를 \b여러 번 인쇄 한 다음 이전 숫자를 새 숫자로 덮어 씁니다.


흥미롭게도 나는 그런 식으로 생각하지 않았습니다.
Chris Ballance

나는 이전 명령을 지우지 않기 때문에 이것을 좋아합니다 (화면에 여러 단계를두고 싶다면)
Nathan Donnellan

3
캐리지 리턴 (예 :)을 사용하면 print 'Downloading.... \r'이전 데이터가 지워지지 않지만 백업 거리를 알 필요가 없습니다.
cod3monk3y

8
#kinda like the one above but better :P

from __future__ import print_function
from time import sleep

for i in range(101):
  str1="Downloading File FooFile.txt [{}%]".format(i)
  back="\b"*len(str1)
  print(str1, end="")
  sleep(0.1)
  print(back, end="")

왜 이것이 위의 것보다 낫습니까 (Python n00b이므로 내 무지를 용서하십시오 :-))?
BalinKingOfMoria Reinstate CMs

7

Python 3xx의 경우 :

import time
for i in range(10):
    time.sleep(0.2) 
    print ("\r Loading... {}".format(i)+str(i), end="")

4

나를 위해 일한 깔끔한 솔루션은 다음과 같습니다.

from __future__ import print_function
import sys
for i in range(10**6):
    perc = float(i) / 10**6 * 100
    print(">>> Download is {}% complete      ".format(perc), end='\r')
    sys.stdout.flush()
print("")

sys.stdout.flush달리 정말 투박 가져오고 중요하다 print("")루프 종료에 대한에도 중요하다.

UPDATE : 코멘트에서 언급 한 바와 같이, print또한이 flush인수를. 따라서 다음도 작동합니다.

from __future__ import print_function
for i in range(10**6):
    perc = float(i) / 10**6 * 100
    print(">>> Download is {}% complete      ".format(perc), end='\r', flush=True)
print("")

1
현대 파이썬에서, 당신의 인수 제공 할 수 있습니다 flush=True에를 print, 그래서 여분 필요가 없습니다 sys.stdout.flush()호출.
PM 2Ring

0
x="A Sting {}"
   for i in range(0,1000000):
y=list(x.format(i))
print(x.format(i),end="")

for j in range(0,len(y)):
    print("\b",end="")
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.