この場合、単に使用して\r
も機能しません。これは、行の先頭に戻るため、行全体を再印刷する必要があるためです。また、一部のシステム(Windowsを含む)では、Pythonのprint
ステートメント(3以降の関数)\r
は改行として解釈されます。このコードはシステムに依存しないはずだと思います。
import sys, time
with open('names.txt', 'r') as names:
prev_len = 0
for name in names:
sys.stdout.write('\r' + ' ' * prev_len)
sys.stdout.flush()
output_string = '\rname={}'.format(name.strip())
prev_len = len(output_string)
sys.stdout.write(output_string)
sys.stdout.flush()
time.sleep(0.3)
print
、を使用することもできます\b
。これは通常、カーソルを1スペース戻します。
ご指摘のとおり、前に印刷した行をスペースで上書きする必要があります。つまり、前の行の長さを覚えておく必要があります。その状態をオブジェクトにカプセル化することは理にかなっていると思います。その戦略を使用する上記よりもはるかにクリーンなソリューションは次のとおりです。
import sys, time
class LineUpdater(object):
def __init__(self, outfile=None):
self.prev_len = 0
self.outfile = sys.stdout if outfile is None else outfile
def write(self, line):
line = line.strip()
output = '\r{:<{width}}'.format(line, width=self.prev_len)
self.prev_len = len(line)
self.outfile.write(output)
self.outfile.flush()
with open('names.txt', 'r') as names:
out = LineUpdater()
for name in names:
out.write('name={}'.format(name))
time.sleep(0.3)
print