2014-02-05 45 views
0

我想知道如何正確地解決類似這樣的問題,請在像貝殼吧進展它看起來像這樣:如何使用python

#!/usr/bin/env python 

import time 
import sys 
import random 

total = 100 
progress = 0 

for i in xrange(0, 100): 
    time.sleep(0.01) 
    progress += 1 
    random_word = 'a' * random.randint(1, 10) 
    random_int = random.randint(4, 12) 
    how_many_characters = 99 
    sys.stdout.write("%d/100 %s\n" % (progress, random_word * random_int)) 
    sys.stdout.write("\b" * how_many_characters) 

雖然此行

sys.stdout.write("\b" * how_many_characters) 

是問題所在。

如何確定上一行開始的位置以及它的長度?或者如何移動到前一行的第一個字符?或者我還能做什麼?我想實現的是改變已經顯示的文本

1/100 Crazy white fox jumping over fence\n 

分爲:

2/100 Crazy white fox jumping over fence\n 

的額外要求:

  • 我無法從原句
  • 我刪除尾隨\ n知道進度條顯示在上一行的開頭

編輯。

改進的問題以消除歧義。

+0

它有什麼問題,你想做什麼? – tayfun

+0

假設你想以增加的方式打印一個字符次數:'sys.stdout.write(「 - 」* progress)'但是'\ b'是退格字符不是嗎? – tayfun

+0

執行我寫的這個shell腳本。它的更新進度爲1/100,2/100,3/100等。我想更新舊值而不打印新值。只要您的控制檯每行約90個字符,此方法就可以工作。 – Drachenfels

回答

0

試試這個:)

import time 
import sys 

total = 100 
progress = 0 

for i in xrange(0, 9): 
    time.sleep(0.01) 
    progress += 1 
    sys.stdout.write("\b"*5) 
    sys.stdout.write("%d/100" % progress) 
    sys.stdout.flush() 
for i in xrange(10, 100): 
    time.sleep(0.01) 
    progress += 1 
    sys.stdout.write("\b"*6) 
    sys.stdout.write("%d/100" % progress) 
    sys.stdout.flush() 

time.sleep(0.01) 
progress += 1 
sys.stdout.write("\b"*7) 
sys.stdout.write("%d/100" % progress) 
sys.stdout.flush() 


sys.stdout.write("\n") 
+0

這個答案不會做,如果你考慮到我最後的編輯。 – Drachenfels

+0

我真的不明白你想要的效果...也許你可以使用一些系統功能來獲得控制檯的寬度,並像一個真正的'\ n',我很抱歉 –

+0

腳本我把原來的問題是隻要殼長達91個字符,對我來說工作得很好。我可以從系統中讀取shell的大小(我猜),但它會將我的代碼與shell和操作系統(我猜)結合起來。所以我正在尋找的是一種乾淨的方式來實現這一點。也許有一條命令像線的第一個字符或刪除線或上一條線,也許我們有更多的東西比\ B或有另一種方式,我可以實現相同的。 – Drachenfels

0

我知道你想從註釋刪除以前的進度指示器。

您應該刪除換行符,將sys.stdout.write("%d/100\n" % progress)替換爲sys.stdout.write("%d/100" % progress),以便可以將其刪除。

+0

我會這樣做,只是我使用別人的腳本,所以我不能。 :) – Drachenfels