2012-06-16 53 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

相關問題