用Pythonreplace控制台输出
我想知道如何在Python中创build一个非常漂亮的控制台,就像在某些C / C ++程序中一样。
我有一个循环做的事情,目前的产出是沿着的:
Doing thing 0 Doing thing 1 Doing thing 2 ...
更新更新会是最后一行更新;
X things done.
我已经在一些控制台程序中看到了这个,我想知道是否/如何在Python中执行此操作。
一个简单的解决scheme就是在string前面写"\r"
而不添加换行符。 如果string永远不会变短这是足够的…
sys.stdout.write("\rDoing thing %i" % i) sys.stdout.flush()
稍微复杂一点是进度条…这是我正在使用的东西:
def startProgress(title): global progress_x sys.stdout.write(title + ": [" + "-"*40 + "]" + chr(8)*41) sys.stdout.flush() progress_x = 0 def progress(x): global progress_x x = int(x * 40 // 100) sys.stdout.write("#" * (x - progress_x)) sys.stdout.flush() progress_x = x def endProgress(): sys.stdout.write("#" * (40 - progress_x) + "]\n") sys.stdout.flush()
您调用startProgress
传递操作的描述,然后progress(x)
其中x
是百分比,最后是endProgress()
更优雅的解决scheme可能是:
def progressBar(value, endvalue, bar_length=20): percent = float(value) / endvalue arrow = '-' * int(round(percent * bar_length)-1) + '>' spaces = ' ' * (bar_length - len(arrow)) sys.stdout.write("\rPercent: [{0}] {1}%".format(arrow + spaces, int(round(percent * 100)))) sys.stdout.flush()
用value和endvalue来调用这个函数,结果应该是
Percent: [-------------> ] 69%
另一个答案可能会更好,但这是我正在做的。 首先,我做了一个叫做进度的function,打印退格字符:
def progress(x): out = '%s things done' % x # The output bs = '\b' * 1000 # The backspace print bs, print out,
然后我在主函数中循环调用它,如下所示:
def main(): for x in range(20): progress(x) return
这当然会抹去整条线路,但是你可以把它搞砸到做你想要的东西。 我结束了使用这种方法进度条。
如果我理解的很好(不确定),你想打印使用<CR>
而不是<LR>
?
如果是这样的话,只要控制台terminal允许(当输出siredirect到一个文件时它会中断)。
from __future__ import print_function print("count x\r", file=sys.stdout, end=" ")
对于任何一个在今后几年(如我一样)磕磕绊绊的人,我调整了6502的方法,让进度条减less和增加。 在稍微更多的情况下有用。 感谢6502一个伟大的工具!
基本上,唯一的区别是每次调用progress(x)时都会写入#s和-s的整行,并且光标总是返回到bar的起始处。
def startprogress(title): """Creates a progress bar 40 chars long on the console and moves cursor back to beginning with BS character""" global progress_x sys.stdout.write(title + ": [" + "-" * 40 + "]" + chr(8) * 41) sys.stdout.flush() progress_x = 0 def progress(x): """Sets progress bar to a certain percentage x. Progress is given as whole percentage, ie 50% done is given by x = 50""" global progress_x x = int(x * 40 // 100) sys.stdout.write("#" * x + "-" * (40 - x) + "]" + chr(8) * 41) sys.stdout.flush() progress_x = x def endprogress(): """End of progress bar; Write full bar, then move to next line""" sys.stdout.write("#" * 40 + "]\n") sys.stdout.flush()