我想在一行中打印字符串。
我找到了解决方案,但他们并不适用于Windows正确。
我有文本文件包含的名字,我想打印出来这样的
name=john
然后更改约翰下一名,并保留name=
,我做了这个代码,但没有与Windows正常工作:
op = open('names.txt','r')
print 'name=',
for i in op.readlines():
print '\r'+i.strip('\n')
感谢您的时间
我想在一行中打印字符串。
我找到了解决方案,但他们并不适用于Windows正确。
我有文本文件包含的名字,我想打印出来这样的
name=john
然后更改约翰下一名,并保留name=
,我做了这个代码,但没有与Windows正常工作:
op = open('names.txt','r')
print 'name=',
for i in op.readlines():
print '\r'+i.strip('\n')
感谢您的时间
使用“\ 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)
只需用\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