次のようなコードがあったとします。
for x in range(10):
print(x)
出力は次のようになります
1
2
etc..
私がやりたいのは、改行を印刷する代わりに、以前の値を置き換えて、同じ行の新しい値で上書きすることです。
ベストアンサー1
シンプルバージョン
1 つの方法は、キャリッジ リターン ( '\r'
) 文字を使用して、次の行に進まずに行の先頭に戻ることです。
Python3 について
for x in range(10):
print(x, end='\r')
print()
Python 2.7 の上位互換性
from __future__ import print_function
for x in range(10):
print(x, end='\r')
print()
Python 2.7
for x in range(10):
print '{}\r'.format(x),
print
Python 2.0-2.6
for x in range(10):
print '{0}\r'.format(x),
print
後者の 2 つのケース (Python 2 のみ) では、print ステートメントの末尾のカンマによって、次の行に進まないことが指示されます。最後の print ステートメントは次の行に進むため、プロンプトによって最終出力が上書きされることはありません。
ラインクリーニング
新しいテキスト行が既存の行より短くないことを保証できない場合は、「行末までクリア」エスケープ シーケンス'\x1b[1K'
( '\x1b'
= ESC) を追加するだけです。
for x in range(75):
print('*' * (75 - x), x, end='\x1b[1K\r')
print()
ロングラインラップ
これらの方法はすべて、行の長さを超えて書き込まないことを前提としています。キャリッジ リターンは現在の行の先頭に戻るだけなので、出力が行より長い場合は、最後の行のみが消去されます。
これが制御する必要があるほどの問題である場合は、行の折り返しを無効にして、カーソルが次の行に折り返されないようにすることができます。 (代わりに、カーソルは行末に固定され、後続の文字が上書きされます。)
行折り返しは で無効にされprint('\x1b[7l', end='')
、 で再度有効になりますprint('\x1b[7h', end='')
。行折り返しはどの時点でも自動的に再度有効にならないことに注意してください。例外によってプログラムが終了した場合、ターミナルを壊れたままにしないでください。