如何在控制台上的相同位置写入输出?

我是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="") 
Interesting Posts