29

Unix では、\r(キャリッジ リターン) または\b(バックスペース) を使用して、シェルで現在の行を上書きする (既に表示されているテキストを上書きする) ことができます。

Python スクリプトから Windows コマンド ラインで同じ効果を得ることができますか?

curses モジュールを試しましたが、Windows では利用できないようです。

4

11 に答える 11

34

はい:

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()
于 2009-01-21T14:15:10.657 に答える
7

私はちょうどこの問題を抱えていました。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ステートメントに注意してください。

于 2014-11-27T16:25:56.227 に答える
6

簡単な方法:

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)
于 2016-08-01T20:27:20.497 に答える
3

前の行を更新したいだけの場合の簡単な方法:

import time
for i in range(20):
    print str(i) + '\r',
    time.sleep(1)
于 2009-01-22T00:37:07.717 に答える
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))

印刷関数が呼び出されるたびに同じ行が更新されます。

このアルゴリズムは改善できますが、何ができるかを示すために投稿されています。必要に応じてメソッドを変更できます。

于 2012-03-03T05:13:01.137 に答える