如何在控制台上的相同位置写入输出?
我是python的新手,正在编写一些脚本来自动从FTP服务器下载文件等。我想显示下载的进度,但我希望它保持在相同的位置,如:
输出:
正在下载文件FooFile.txt [47%]
我试图避免这样的事情:
Downloading File FooFile.txt [47%] Downloading File FooFile.txt [48%] Downloading File FooFile.txt [49%]
我应该怎么做呢?
重复 : 如何在命令行应用程序中打印当前行?
您也可以使用回车:
sys.stdout.write("Download progress: %d%% \r" % (progress) ) sys.stdout.flush()
使用像curses模块这样的terminal处理库:
curses模块为curses库提供了一个接口,这是便携式高级terminal处理的事实标准。
多次打印退格字符\b
,然后用新的数字覆盖旧数字。
我喜欢以下内容:
print 'Downloading File FooFile.txt [%d%%]\r'%i,
演示:
import time for i in range(100): time.sleep(0.1) print 'Downloading File FooFile.txt [%d%%]\r'%i,
#kinda like the one above but better :P from __future__ import print_function from time import sleep for i in range(101): str1="Downloading File FooFile.txt [{}%]".format(i) back="\b"*len(str1) print(str1, end="") sleep(0.1) print(back, end="")
一直在为我工作的整洁解决scheme是:
from __future__ import print_function import sys for i in range(10**6): perc = float(i) / 10**6 * 100 print(">>> Download is {}% complete ".format(perc), end='\r') sys.stdout.flush() print("")
sys.stdout.flush
非常重要,否则它变得非常笨重,for循环退出的print("")
也很重要。
更新 :正如在评论中提到的, print
还有一个flush
参数。 所以下面也会起作用:
from __future__ import print_function for i in range(10**6): perc = float(i) / 10**6 * 100 print(">>> Download is {}% complete ".format(perc), end='\r', flush=True) print("")
对于Python 3xx:
import time for i in range(10): time.sleep(0.2) print ("\r Loading... ".format(i)+str(i), end="")