我正在尝试在一行中打印字符串。
我找到了解决方案,但它们不能正确使用 Windows。
我有包含名称的文本文件,我想像这样打印它们
name=john
然后将 john 更改为下一个名称并保留name=
,我已经制作了这段代码,但在 windows 上无法正常工作:
op = open('names.txt','r')
print 'name=',
for i in op.readlines():
print '\r'+i.strip('\n')
感谢您的时间
我正在尝试在一行中打印字符串。
我找到了解决方案,但它们不能正确使用 Windows。
我有包含名称的文本文件,我想像这样打印它们
name=john
然后将 john 更改为下一个名称并保留name=
,我已经制作了这段代码,但在 windows 上无法正常工作:
op = open('names.txt','r')
print 'name=',
for i in op.readlines():
print '\r'+i.strip('\n')
感谢您的时间
在这种情况下,简单地使用\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
按照 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)