回答:
1つの方法は、キャリッジリターン('\r')文字を使用して、次の行に進めずに行の先頭に戻ることです。
for x in range(10):
print '{0}\r'.format(x),
print
printステートメントの最後のコンマは、次の行に移動しないように指示します。最後の印刷ステートメントは次の行に進むため、プロンプトによって最終出力が上書きされることはありません。
Python 2がEOLになった今、Python 3の答えはもっと理にかなっています。Python 3.5以前の場合:
for x in range(10):
print('{}\r'.format(x), end="")
print()
Python 3.6以降では、f-stringsはより読みやすくなっています。
for x in range(10):
print(f'{x}\r', end="")
print()
%オペレータが推奨されていません。基本的に、すべての文字列にフォーマットメソッドがあります。この場合、{0}「」への最初の引数format()(カウントは0から始まります)を意味します。
re.sub(r'\$<\d+>[/*]?', '', curses.tigetstr('el') or '')、ユーザーが使用しているターミナルの行末までの正しい文字列が表示されます。のcursesようなもので初期化し、出力がファイルにリダイレクトされないcurses.setupterm(fd=sys.stdout.fileno())ようsys.stdout.isatty()にするために使用することを忘れないでください。カーソルコントロールとカラーサポートを備えた完全なPythonモジュールについては、code.activestate.com / recipes / 475116を参照してください。
import curses; curses.setupterm(fd=sys.stdout.fileno()); print(hex(curses.tigetstr('cr')));文字列の16進コードを印刷して、行の先頭に移動します。
私はここでGoogle経由で終了しましたが、Python 3を使用しているので、これがPython 3でどのように機能するかを次に示します。
for x in range(10):
print("Progress {:2.1%}".format(x / 10), end="\r")
ここでの関連回答:印刷ステートメントの後の改行を抑制するにはどうすればよいですか?
testingと2番目のループ印刷testが2回目のパスの後の出力が残っている場合testing、@ Nagasaki45がこれを指摘していることがわかります
print("\r", message, end="")
@Mike DeSimoneの回答はおそらくほとんどの場合機能します。だが...
for x in ['abc', 1]:
print '{}\r'.format(x),
-> 1bc
これは'\r'、行の先頭に戻るだけで、出力はクリアされないためです。
POSIXサポートで十分な場合は、次のようにすると現在の行がクリアされ、カーソルが先頭に残ります。
print '\x1b[2K\r',
ANSIエスケープコードを使用して、端末回線をクリアします。詳細については、ウィキペディアとこのすばらしい講演をご覧ください。
私が見つけた(それほど良くない)ソリューションは次のようになります:
last_x = ''
for x in ['abc', 1]:
print ' ' * len(str(last_x)) + '\r',
print '{}\r'.format(x),
last_x = x
-> 1
1つの利点は、Windowsでも機能することです。
このスレッドにアクセスする前に同じ質問がありました。私にとって、sys.stdout.writeは、バッファを適切にフラッシュした場合にのみ機能しました。
for x in range(10):
sys.stdout.write('\r'+str(x))
sys.stdout.flush()
フラッシュしない場合、結果はスクリプトの最後にのみ出力されます
stringvar.ljust(10,' ')可変長の文字列の場合のように、残りの文字列をスペースで埋めることもお勧めします。
改行を抑制して印刷します\r。
print 1,
print '\r2'
またはstdoutに書き込みます。
sys.stdout.write('1')
sys.stdout.write('\r2')
これを試して:
import time
while True:
print("Hi ", end="\r")
time.sleep(1)
print("Bob", end="\r")
time.sleep(1)
それは私のために働いた。 end="\r"一部では、それは前の行を上書きしつつあります。
警告!
を出力しhi、次にhelloを使用して出力\rするhilloと、出力が前の2つの文字を上書きしたために得られます。プリントアウトする場合hiスペース(ここには表示されません)を付けと、が出力されますhi。これを修正するには、を使用してスペースを印刷します\r。
Hi BobHi BobHi BobHi BobHi Bobです。Python 3.7.1
\rが終わりではなく最初にあるということです。
このページのソリューションをIPythonで機能させることはできませんでしたが、@ Mike-Desimoneのソリューションを少し変更するだけでうまくいきました。改行で行を終了するのではなく、改行で行を開始します。
for x in range(10):
print '\r{0}'.format(x),
さらに、このアプローチでは、2番目の印刷ステートメントは必要ありません。
これはWindowsとPython 3.6で動作します
import time
for x in range(10):
time.sleep(0.5)
print(str(x)+'\r',end='')
受け入れられた答えは完璧ではありません。最初に印刷された行はそのまま残り、2番目の印刷が新しい行全体をカバーしない場合、最終的に文字化けします。
問題を説明するために、このコードをスクリプトとして保存して実行します(または単に見てみます)。
import time
n = 100
for i in range(100):
for j in range(100):
print("Progress {:2.1%}".format(j / 100), end="\r")
time.sleep(0.01)
print("Progress {:2.1%}".format(i / 100))
出力は次のようになります。
Progress 0.0%%
Progress 1.0%%
Progress 2.0%%
Progress 3.0%%
私にとって有効なのは、永久的なプリントを残す前に線をクリアすることです。特定の問題に自由に調整してください。
import time
ERASE_LINE = '\x1b[2K' # erase line command
n = 100
for i in range(100):
for j in range(100):
print("Progress {:2.1%}".format(j / 100), end="\r")
time.sleep(0.01)
print(ERASE_LINE + "Progress {:2.1%}".format(i / 100)) # clear the line first
そして、期待通りに印刷されます:
Progress 0.0%
Progress 1.0%
Progress 2.0%
Progress 3.0%
これは、@ Nagasaki45の回答の、よりクリーンでより「プラグアンドプレイ」なバージョンです。ここでの他の多くの回答とは異なり、異なる長さの文字列で正しく動作します。これは、印刷された最後の行の長さと同じだけのスペースで行をクリアすることによってこれを実現します。Windowsでも動作します。
def print_statusline(msg: str):
last_msg_length = len(print_statusline.last_msg) if hasattr(print_statusline, 'last_msg') else 0
print(' ' * last_msg_length, end='\r')
print(msg, end='\r')
sys.stdout.flush() # Some say they needed this, I didn't.
print_statusline.last_msg = msg
次のように使用するだけです。
for msg in ["Initializing...", "Initialization successful!"]:
print_statusline(msg)
time.sleep(1)
この小さなテストは、さまざまな長さでも線が適切にクリアされることを示しています。
for i in range(9, 0, -1):
print_statusline("{}".format(i) * i)
time.sleep(0.5)
誰もバックスペース文字を使用していないことに少し驚いています。これを使用するものは次のとおりです。
import sys
import time
secs = 1000
while True:
time.sleep(1) #wait for a full second to pass before assigning a second
secs += 1 #acknowledge a second has passed
sys.stdout.write(str(secs))
for i in range(len(str(secs))):
sys.stdout.write('\b')
sys.stdout.flush()
(Python3)これは私のために働いたものです。\ 010だけを使用すると、文字が残るので、少し調整して、そこにあったものを上書きするようにしました。これにより、最初の印刷アイテムの前に何かを置くことができ、アイテムの長さだけが削除されます。
print("Here are some strings: ", end="")
items = ["abcd", "abcdef", "defqrs", "lmnop", "xyz"]
for item in items:
print(item, end="")
for i in range(len(item)): # only moving back the length of the item
print("\010 \010", end="") # the trick!
time.sleep(0.2) # so you can see what it's doing
以前の回答に基づくもう1つの回答。
pbar.pyの内容:sys、shutil、datetimeのインポート
last_line_is_progress_bar=False
def print2(print_string):
global last_line_is_progress_bar
if last_line_is_progress_bar:
_delete_last_line()
last_line_is_progress_bar=False
print(print_string)
def _delete_last_line():
sys.stdout.write('\b\b\r')
sys.stdout.write(' '*shutil.get_terminal_size((80, 20)).columns)
sys.stdout.write('\b\r')
sys.stdout.flush()
def update_progress_bar(current, total):
global last_line_is_progress_bar
last_line_is_progress_bar=True
completed_percentage = round(current / (total / 100))
current_time=datetime.datetime.now().strftime('%m/%d/%Y-%H:%M:%S')
overhead_length = len(current_time+str(current))+13
console_width = shutil.get_terminal_size((80, 20)).columns - overhead_length
completed_width = round(console_width * completed_percentage / 100)
not_completed_width = console_width - completed_width
sys.stdout.write('\b\b\r')
sys.stdout.write('{}> [{}{}] {} - {}% '.format(current_time, '#'*completed_width, '-'*not_completed_width, current,
completed_percentage),)
sys.stdout.flush()
スクリプトの使用法:
import time
from pbar import update_progress_bar, print2
update_progress_bar(45,200)
time.sleep(1)
update_progress_bar(70,200)
time.sleep(1)
update_progress_bar(100,200)
time.sleep(1)
update_progress_bar(130,200)
time.sleep(1)
print2('some text that will re-place current progress bar')
time.sleep(1)
update_progress_bar(111,200)
time.sleep(1)
print('\n') # without \n next line will be attached to the end of the progress bar
print('built in print function that will push progress bar one line up')
time.sleep(1)
update_progress_bar(111,200)
time.sleep(1)
これが私の解決策です!Windows 10、Python 3.7.1
このコードが機能する理由はわかりませんが、元の行が完全に消去されます。以前の回答からまとめました。他の答えは行を最初に戻しますが、後で短い行があると、にhello変わりbyeloます。
import sys
#include ctypes if you're on Windows
import ctypes
kernel32 = ctypes.windll.kernel32
kernel32.SetConsoleMode(kernel32.GetStdHandle(-11), 7)
#end ctypes
def clearline(msg):
CURSOR_UP_ONE = '\033[K'
ERASE_LINE = '\x1b[2K'
sys.stdout.write(CURSOR_UP_ONE)
sys.stdout.write(ERASE_LINE+'\r')
print(msg, end='\r')
#example
ig_usernames = ['beyonce','selenagomez']
for name in ig_usernames:
clearline("SCRAPING COMPLETE: "+ name)
出力-各行は、古いテキストを表示せずに書き換えられます。
SCRAPING COMPLETE: selenagomez
次の行(完全に同じ行に書き直されます):
SCRAPING COMPLETE: beyonce