2

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

我找到了解决方案,但它们不能正确使用 Windows。

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

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

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

感谢您的时间

4

2 回答 2

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

您也可以使用\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
于 2012-06-16T14:25:43.500 回答
1

按照 senderle 的建议使用 '\b'

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)
于 2012-06-16T15:03:32.793 回答