2012-06-16 52 views
2

我试图在一行中打印字符串。在python中的一行中动态地打印字符串

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

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

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

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

感谢您的时间

+0

的建议只是为了澄清,要_overwrite_行的一部分,是正确? – senderle

回答

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) 
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 
+0

先生您的代码不与Windows正常工作,,问题是,如果你例如打印长的名字'naaaaaaaaaaaaame'那么下一个名字是'john'输出会像'johnaaaaaaaaaame' 我之前已经试过您的解决方案我发布这个问题,并没有与Windows – Hamoudaq

+0

啊!当然,'\ r'通常用于打印等长的行。这对任何系统都不适用于您的目的!我会更新。 – senderle

+0

@EngHamoud,看我的编辑。新代码应该正常工作。可能有更好的方法来做到这一点,但它至少起作用! – senderle

相关问题