在python中以一行动态打印字符串

Ham*_*daq 2 python printing command-line line

我正在尝试在一行中打印字符串.

我找到了解决方案,但它们无法正常使用Windows.

我有文本文件包含名称,我想像这样打印它们

name=john然后将john更改为下一个名称并保持name=,我已经制作了这段代码,但是无法正常使用windows:

op = open('names.txt','r')
print 'name=',
for i in op.readlines():
    print '\r'+i.strip('\n')
Run Code Online (Sandbox Code Playgroud)

感谢您的时间

sen*_*rle 5

简单地使用\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
Run Code Online (Sandbox Code Playgroud)

您也可以使用\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
Run Code Online (Sandbox Code Playgroud)