2014-02-05 44 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