只需用\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
,它通常会将光标向后移动一个空格。
正如你指出,这是必要的覆盖用空格先前打印线,这意味着要记住以前的线的长度是必要的。我想,把这个状态封装在一个对象中是有意义的。这里有一个比上面那个更清洁的解决方案使用的策略:
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
的建议只是为了澄清,要_overwrite_行的一部分,是正确? – senderle