web-dev-qa-db-ja.com

コンソールの同じ場所に出力を書き込むにはどうすればよいですか?

私はpythonが初めてで、FTPサーバーなどからのファイルのダウンロードを自動化するためのスクリプトをいくつか書いています。

出力:

ファイルFooFile.txtのダウンロード[47%]

私はこのようなことを避けようとしています:

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

これを行うにはどうすればよいですか?


Duplicateコマンドラインアプリケーションで現在の行に印刷するにはどうすればよいですか?

140
scottm

キャリッジリターンも使用できます。

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

curses module のような端末処理ライブラリを使用します。

Cursesモジュールは、ポータブルな高度な端末処理のための事実上の標準であるcursesライブラリへのインターフェースを提供します。

25
gimel

Python 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,

Python 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="")
23
RSabet

バックスペース文字\bを数回印刷してから、古い番号を新しい番号で上書きします。

15
Zach Scrivena
#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="")
8

Python 3xxの場合:

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

私のために働いてきたきちんとしたソリューションは次のとおりです。

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は重要です。それ以外の場合は非常に不格好になります。また、forループの終了に対する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("")
3
Michael Hall
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="")
0
Malay Hazarika