打印动态字符串中在python一行(printing dynamically string in o

2019-06-25 12:58发布

我想在一行中打印字符串。

我找到了解决方案,但他们并不适用于Windows正确。

我有文本文件包含的名字,我想打印出来这样的

name=john然后更改约翰下一名,并保留name= ,我做了这个代码,但没有与Windows正常工作:

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

感谢您的时间

Answer 1:

使用“\ B”由senderle的建议

import sys
import time

sys.stdout.write('name=')
last_lenght = 0
with open('names.txt') as names:
    for name in names:
        sys.stdout.write('\b' * last_lenght)    # go back
        sys.stdout.write(' ' * last_lenght)     # clear last name
        sys.stdout.write('\b' * last_lenght)    # reposition
        sys.stdout.write(name.strip())
        sys.stdout.flush()
        last_lenght = len(name.strip())
        time.sleep(0.5)


Answer 2:

只需用\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


文章来源: printing dynamically string in one line in python