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

sco*_*ttm 148 python console-output

我是python的新手,我正在编写一些脚本来自动从FTP服务器等下载文件.我想显示下载的进度,但我希望它保持在相同的位置,例如:

输出:

正在下载文件FooFile.txt [47%]

我试图避免这样的事情:

     Downloading File FooFile.txt [47%]
     Downloading File FooFile.txt [48%]
     Downloading File FooFile.txt [49%]
Run Code Online (Sandbox Code Playgroud)

我应该怎么做呢?


重复: 如何在命令行应用程序中打印当前行?

cod*_*gic 239

您还可以使用回车:

sys.stdout.write("Download progress: %d%%   \r" % (progress) )
sys.stdout.flush()
Run Code Online (Sandbox Code Playgroud)

  • 是否可以使用多行进行此操作?可以说我有三种不同的下载,我想在每一行上显示每一个的进度. (18认同)
  • 非常常见且简单的解决方案 注意:如果您的线路长度超过终端的宽度,则会变得很难看. (13认同)
  • 我喜欢将`\ r`放在行的开头,并添加一个`\ x1b [K`来清除前一个文本. (9认同)
  • 对于python 3来说,最简单的解决方案(如下面的答案中所述)似乎是:`print("sample text",end ='\ r \n",flush = True) (6认同)
  • 我还必须添加对sys.stdout.flush()的调用,以便光标不会反弹 (4认同)
  • 如果我有多行怎么办?例如,多个下载同时发生。当我仅添加换行符时,它似乎不起作用,它可以无限打印。即,`sys.stdout.write(“下载进度:%d %% \ n \ r”%(进度)))不起作用 (2认同)

gim*_*mel 27

使用像curses模块这样的终端处理库:

curses模块提供了curses库的接口,这是便携式高级终端处理的事实标准.

  • 不适用于 Windows。 (3认同)
  • @Diego现在有一个Windows上的curses模块支持库.见http://stackoverflow.com/a/19851287/1426237 (3认同)

RSa*_*bet 26

Python 2

我喜欢以下内容:

print 'Downloading File FooFile.txt [%d%%]\r'%i,
Run Code Online (Sandbox Code Playgroud)

演示:

import time

for i in range(100):
    time.sleep(0.1)
    print 'Downloading File FooFile.txt [%d%%]\r'%i,
Run Code Online (Sandbox Code Playgroud)

Python 3

print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
Run Code Online (Sandbox Code Playgroud)

演示:

import time

for i in range(100):
    time.sleep(0.1)
    print('Downloading File FooFile.txt [%d%%]\r'%i, end="")
Run Code Online (Sandbox Code Playgroud)

  • 用于python 3+:print('下载文件FooFile.txt [%d %%]\r'%i,end ="") (9认同)

Zac*_*ena 15

\b多次打印退格符,然后用新号码覆盖旧号码.

  • 使用回车符(例如'print'download ....\r'`)也不能清除以前的数据,但它可以防止必须知道备份的距离. (2认同)

小智 8

#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="")
Run Code Online (Sandbox Code Playgroud)


The*_*ify 6

对于Python 3xx:

import time
for i in range(10):
    time.sleep(0.2) 
    print ("\r Loading... {}".format(i)+str(i), end="")
Run Code Online (Sandbox Code Playgroud)

  • 打印(“ \ r正在加载... {}”。format(i),end =“”) (4认同)