Unix では、\r
(キャリッジ リターン) または\b
(バックスペース) を使用して、シェルで現在の行を上書きする (既に表示されているテキストを上書きする) ことができます。
Python スクリプトから Windows コマンド ラインで同じ効果を得ることができますか?
curses モジュールを試しましたが、Windows では利用できないようです。
Unix では、\r
(キャリッジ リターン) または\b
(バックスペース) を使用して、シェルで現在の行を上書きする (既に表示されているテキストを上書きする) ことができます。
Python スクリプトから Windows コマンド ラインで同じ効果を得ることができますか?
curses モジュールを試しましたが、Windows では利用できないようです。
はい:
import sys
import time
def restart_line():
sys.stdout.write('\r')
sys.stdout.flush()
sys.stdout.write('some data')
sys.stdout.flush()
time.sleep(2) # wait 2 seconds...
restart_line()
sys.stdout.write('other different data')
sys.stdout.flush()
私はちょうどこの問題を抱えていました。Windows コマンド プロンプトでも引き続き を使用できます\r
が、前の改行 ( \n
) に戻るだけです。
次のようなことをすると:
cnt = 0
print str(cnt)
while True:
cnt += 1
print "\r" + str(cnt)
あなたは得るでしょう:
0
1
2
3
4
5
...
これ\r
は、最後の行にしか戻らないためです。最後の print ステートメントで既に改行文字を書いているので、カーソルは新しい空行の先頭から同じ新しい空行の先頭に移動します。
たとえば、最初の 0 を出力すると、カーソルは次のようになります。
0
| # <-- Cursor
のとき\r
は、行の先頭に移動します。しかし、あなたはすでに列の先頭に立っています。
修正は、文字を印刷しないようにすること\n
です。これにより、カーソルが同じ行にあり\r
、テキストが適切に上書きされます。でそれを行うことができますprint 'text',
。コンマは、改行文字の印刷を防ぎます。
cnt = 0
print str(cnt),
while True:
cnt += 1
print "\r" + str(cnt),
これで、行が適切に書き換えられます。
これは Python 2.7 であるため、print
ステートメントに注意してください。
簡単な方法:
import sys
from time import sleep
import os
#print("\033[y coordinate;[x coordinateH Hello")
os.system('cls')
sleep(0.2)
print("\033[1;1H[]")
sleep(0.2)
print("\033[1;1H []")
sleep(0.2)
print("\033[1;1H []")
sleep(0.2)
print("\033[1;1H []")
sleep(0.2)
print("\033[1;1H []")
sleep(0.2)
print("\033[1;1H []")
sleep(0.2)
print("\033[1;1H []")
sleep(0.2)
print("\033[1;1H []")
sleep(0.2)
print("\033[1;1H[]")
sleep(0.2)
前の行を更新したいだけの場合の簡単な方法:
import time
for i in range(20):
print str(i) + '\r',
time.sleep(1)
Windows(python 3)では、動作しているようです(stdoutを直接使用していません)。
import sys
for i in reversed(range(0,20)):
time.sleep(0.1)
if(i == 19):
print(str(i), end='', file=sys.stdout)
else:
print("\r{0:{width}".format(str(i), width = w, fill = ' ', align = 'right'), end='', file=sys.stdout)
sys.stdout.flush()
w = len(str(i))
印刷関数が呼び出されるたびに同じ行が更新されます。
このアルゴリズムは改善できますが、何ができるかを示すために投稿されています。必要に応じてメソッドを変更できます。